以下是场景:使用频谱分析仪,我有输入值和输出值。样本数为32000
,采样率为2000
个样本/秒,输入为50 hz
的正弦波,输入为电流,输出为psi压力。
如何使用MATLAB从这些数据计算频率响应, 在MATLAB中使用FFT函数。
我能够生成一个正弦波,它给出了幅度和相角,这是我使用的代码:
%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
我从90
度相位角的相位图中获取了频率响应,这是计算频率响应的正确方法吗?
如何将此响应与从分析仪获得的值进行比较?这是一个交叉检查,以查看分析器逻辑是否有意义。
答案 0 :(得分:1)
乍一看看起来很不错,但有几件事你错过了:
您应该在FFT之前对时域数据应用窗口函数,例如, http://en.wikipedia.org/wiki/Window_function用于一般窗口,http://en.wikipedia.org/wiki/Hann_window用于最常用的窗口函数(Hann aka Hanning)。
您可能希望以dB为单位绘制对数幅度,而不仅仅是原始幅度
答案 1 :(得分:0)
您应该考虑查看cpsd()函数来计算频率响应。为您处理各种窗口函数的缩放和规范化。
频率响应将是
G = cpsd (output,input) / cpsd (input,input)
然后取angle()
以获得输入和输出之间的相位差。
您的代码段未提及输入和输出数据集是什么。