[英]Frequency response using FFT in MATLAB
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. 样本数为
32000
,采样率为2000
样本/秒,输入为50 hz
的正弦波,输入为电流,输出为压力,单位为psi。
How do i calculate the frequency response from this data using MATLAB, using the FFT function in MATLAB. 如何使用MATLAB使用MATLAB中的FFT函数计算此数据的频率响应。
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? 我从
90
度相位角的相位图中获取了频率响应,这是计算频率响应的正确方法吗?
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: 乍一看看起来不错,但是你遗漏了几件事:
you should apply a window function to the time domain data before the FFT, see eg 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). 你应该在FFT之前对时域数据应用窗口函数,例如http://wind.wikipedia.org/wiki/Window_function用于窗口化, http://en.wikipedia.org/wiki/Hann_window用于最常用的窗口功能(Hann aka Hanning)。
you probably want to plot log magnitude in dB rather than just raw magnitude 您可能希望以dB为单位绘制对数幅度,而不仅仅是原始幅度
You should consider looking at the cpsd() function for calculating the Frequency response. 您应该考虑查看cpsd()函数来计算频率响应。 The scaling and normalisation for various window functions is handled for you.
为您处理各种窗口函数的缩放和规范化。
the Frequency reponse would then be 然后是频率响应
G = cpsd (output,input) / cpsd (input,input)
then take the angle()
to obtain the phase difference between the input and the output. 然后取
angle()
来获得输入和输出之间的相位差。
Your code snippet does not mention what the input and output data sets are. 您的代码段未提及输入和输出数据集。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.