What is the correct normalization for a flat top window?
14 visualizaciones (últimos 30 días)
Mostrar comentarios más antiguos
Claudio Gerosa
el 23 de Abr. de 2024
Comentada: Claudio Gerosa
el 29 de Abr. de 2024
Hi, I have a question about FFT. Considering that I have a data vector of accelerations sampled with an accelerometer and that I want to apply a flat top window, in order to obtain the most accurate amplitude in the FFT, what would be the right code for normalization in this specific case?
I tried this one, but I'm not sure if it's correct:
N=numel(data);
w=flattopwin(N);
X=2*fft(data.*w)/sum(w);
Thanks in advance for you help.
1 comentario
Mathieu NOE
el 23 de Abr. de 2024
try with a sine wave of known amplitude for instance (amplitude = 1 could be quite convenient !)
Respuesta aceptada
Sudarsanan A K
el 29 de Abr. de 2024
Hello Claudio,
Your approach to applying a flat top window and performing the FFT to obtain accurate amplitude information from your data vector is on the right track. The flat top window is particularly useful in spectral analysis when accurate amplitude measurements are essential, as it provides a very flat spectrum for the main lobe, minimizing amplitude errors for signals within its bandwidth.
Here is a simple demonstration of the normalization:
%% I am using a simple signal which is sum of two sinusoids
% Parameters for the signal
fs = 1000; % Sampling frequency in Hz
T = 1; % Total time duration of the signal in seconds
f1 = 50; % Frequency of the first sine wave component in Hz
f2 = 150; % Frequency of the second sine wave component in Hz
A1 = 1.0; % Amplitude of the first sine wave component
A2 = 0.5; % Amplitude of the second sine wave component
% Generate the time vector
t = 0:1/fs:T-1/fs;
% Generate the signal
signal = A1*sin(2*pi*f1*t) + A2*sin(2*pi*f2*t);
%% Apply a flat top window
N = numel(signal);
w = flattopwin(N);
windowedSignal = signal .* w';
%% Perform the FFT
X = fft(windowedSignal);
%% Normalize the FFT output
X_normalized = 2 * abs(X) / sum(w);
% Frequency vector
f = (0:N-1)*(fs/N);
%% Plotting
figure;
subplot(2,1,1);
plot(t, signal);
title('Original Signal');
xlabel('Time (s)');
ylabel('Amplitude');
subplot(2,1,2);
plot(f(1:N/2), X_normalized(1:N/2));
title('Magnitude Spectrum with Flat Top Window');
xlabel('Frequency (Hz)');
ylabel('Amplitude');
xlim([0 200]);
Also, consider the following:
- If you are using the FFT output to calculate power spectral density or similar metrics, further processing might be necessary.
- The choice of 2 as a normalization factor assumes you are analyzing the one-sided spectrum. If you are looking at the full spectrum or have complex-valued data, you might need to adjust this.
- Ensure that your signal of interest's frequency components fall within the main lobe of the flat top window's frequency response to benefit from its amplitude accuracy.
For more information about the "flattopwin" function, please refer to the documentation:
I hope this helps!
Más respuestas (0)
Ver también
Categorías
Más información sobre Spectral Measurements en Help Center y File Exchange.
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!