在MATLAB中使用FFT的频率响应 [英] Frequency response using FFT in MATLAB
问题描述
这里是场景:使用频谱分析仪,我有输入值和输出值.样本数为32000
,采样率为2000
样本/秒,输入为50 hz
的正弦波,输入为电流,输出为psi压力.
Here is the scenario: using a spectrum analyzer i have the input values and the output values. the number of samples is 32000
and the sampling rate is 2000
samples/sec, and the input is a sine wave of 50 hz
, the input is current and the output is pressure in psi.
如何使用MATLAB根据这些数据计算频率响应, 使用MATLAB中的FFT函数.
How do i calculate the frequency response from this data using MATLAB, using the FFT function in MATLAB.
我能够产生一个正弦波,给出了幅度和相位角,这是我使用的代码:
i was able to generate a sine wave, that gives out the the magnitude and phase angles, here is the code that i used:
%FFT Analysis to calculate the frequency response for the raw data
%The FFT allows you to efficiently estimate component frequencies in data from a discrete set of values sampled at a fixed rate
% Sampling frequency(Hz)
Fs = 2000;
% Time vector of 16 second
t = 0:1/Fs:16-1;
% Create a sine wave of 50 Hz.
x = sin(2*pi*t*50);
% Use next highest power of 2 greater than or equal to length(x) to calculate FFT.
nfft = pow2(nextpow2(length(x)))
% Take fft, padding with zeros so that length(fftx) is equal to nfft
fftx = fft(x,nfft);
% Calculate the number of unique points
NumUniquePts = ceil((nfft+1)/2);
% FFT is symmetric, throw away second half
fftx = fftx(1:NumUniquePts);
% Take the magnitude of fft of x and scale the fft so that it is not a function of the length of x
mx = abs(fftx)/length(x);
% Take the square of the magnitude of fft of x.
mx = mx.^2;
% Since we dropped half the FFT, we multiply mx by 2 to keep the same energy.
% The DC component and Nyquist component, if it exists, are unique and should not be multiplied by 2.
if rem(nfft, 2) % odd nfft excludes Nyquist point
mx(2:end) = mx(2:end)*2;
else
mx(2:end -1) = mx(2:end -1)*2;
end
% This is an evenly spaced frequency vector with NumUniquePts points.
f = (0:NumUniquePts-1)*Fs/nfft;
% Generate the plot, title and labels.
subplot(211),plot(f,mx);
title('Power Spectrum of a 50Hz Sine Wave');
xlabel('Frequency (Hz)');
ylabel('Power');
% returns the phase angles, in radians, for each element of complex array fftx
phase = unwrap(angle(fftx));
PHA = phase*180/pi;
subplot(212),plot(f,PHA),title('frequency response');
xlabel('Frequency (Hz)')
ylabel('Phase (Degrees)')
grid on
我从相位图上的相位角处获取了频率响应,这是计算频率响应的正确方法吗?
i took the frequency response from the phase plot at 90
degree phase angle, is this the right way to calculate the frequency response?
我如何将此响应与从分析仪获得的值进行比较?这是一项交叉检查,以查看分析器逻辑是否有意义.
how do i compare this response to the values that is obtained from the analyzer? this is a cross check to see if the analyzer logic makes sense or not.
推荐答案
乍一看似乎还可以,但您可能会缺少以下几点:
Looks OK at first glance, but a couple of things you're missing:
-
您应在FFT之前将窗函数应用于时域数据,请参见例如 http://en.wikipedia.org/wiki/Window_function 用于常规窗口和 http://en.wikipedia.org/wiki/Hann_window 以获得最常用的窗口功能(Hann aka Hanning ).
you should apply a window function to the time domain data before the FFT, see e.g. http://en.wikipedia.org/wiki/Window_function for windowing in general and http://en.wikipedia.org/wiki/Hann_window for the most commonly used window function (Hann aka Hanning).
您可能想绘制以dB为单位的对数幅度,而不仅仅是原始幅度
you probably want to plot log magnitude in dB rather than just raw magnitude
这篇关于在MATLAB中使用FFT的频率响应的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!