matlab FFT。坚持理解频率与结果之间的关系

时间:2008-10-05 01:52:17

标签: matlab fft

我们试图分析圆柱体周围的流动,我们得到了一组从风洞实验中得到的Cp值。最初,我们从20 Hz的采样频率开始,并试图在matlab中使用FFT找到涡旋脱落的频率。我们的频率约为7赫兹。接下来,我们进行了相同的实验,但我们唯一改变的是采样频率 - 从20 Hz到200 Hz。我们得到涡旋脱落的频率约为70 Hz(这是峰值位于图中的位置)。无论我们输入的Cp数据如何,图表都不会改变。峰值不同的唯一时间是我们更改采样频率。看起来涡旋脱落频率的增加与采样频率成正比,这似乎根本没有意义。关于建立采样频率和涡旋脱落频率之间关系的任何帮助都将得到很大的帮助。

7 个答案:

答案 0 :(得分:11)

您所看到的问题与“数据混叠”有关,因为FFT的限制能够检测到高于Nyquist Frequency(采样频率的一半)的频率。

使用数据混叠时,实际频率的峰值将以(实际频率奈奎斯特频率)为中心。在你的20 Hz采样中(假设70 Hz是真实频率,这导致零频率,这意味着你没有看到真实信息。有一件事可以帮助你解决这个问题就是使用FFT“窗口化”。

您可能遇到的另一个问题是通过单FFT测量产生噪声数据。最好采用大量数据,使用重叠窗口,并确保至少有5个FFT,您可以平均找到结果。正如Steven Lowe所说,如果可能的话,你也应该以更快的速度进行抽样。我建议您以最快的速率对仪器进行采样。

最后,我建议您阅读Numerical Recipes in C(< - link)中的一些摘录:

您不需要阅读C源代码 - 只是解释。 C的数字配方具有很好的浓缩信息。

如果您还有其他问题,请将其留在评论中。我会尽力回答他们。

祝你好运!

答案 1 :(得分:4)

这可能不是编程问题,听起来像是一个实验测量问题

我认为采样频率必须至少是振荡频率的两倍,否则就会产生伪影;这可能解释了差异。注意,在两种情况下,FFT频率与采样频率的比率为0.35。你能以更高的采样率重复实验吗?我想如果这是一个在强风中的狭窄气缸,它可能比采样率检测到的振动/振荡更快。

我希望这会有所帮助 - 我不知道我在说什么的概率为97.6%; - )

答案 2 :(得分:2)

如果它不是混叠问题,听起来您可能正在标准化频率范围上绘制频率响应,这将随采样频率而变化。以下是在Matlab中绘制信号频率响应的合理方法示例:

Fs = 100;
Tmax = 10;
time = 0:1/Fs:Tmax; 
omega = 2*pi*10; % 10 Hz
signal = 10*sin(omega*time) + rand(1,Tmax*Fs+1);

Nfft = 2^8;
[Pxx,freq] = pwelch(signal,Nfft,[],[],Fs)
plot(freq,Pxx)

请注意,必须将采样频率显式传递给pwelch命令才能输出“实际”频率数据。否则,当您更改采样频率时,发生共振的区域似乎会发生偏移,这与您描述的问题类似。

答案 3 :(得分:2)

你甚至可以开始理解DFT(FFT)的所有细微差别,然后你需要对数字信号处理进行一些认真的阅读。如果我是你,我会先用这本好书来接受它:

Discrete-Time Signal Processing

如果你想要更多的数学治疗来真正扩展你的能力,

Fourier Analysis by Körner

答案 4 :(得分:0)

查看this相关问题。虽然最初询问有关VB的问题,但响应通常是关于FFT的

答案 5 :(得分:0)

我尝试使用上面的频率响应代码,但似乎我在Matlab中没有相应的工具箱。有没有办法在不使用fft命令的情况下做同样的事情?到目前为止,这就是我所拥有的:

   % FFT Algorithm

Fs = 200;                     % Sampling frequency
T = 1/Fs;                     % Sample time
L = 65536;                    % Length of signal
t = (0:L-1)*T;                % Time vector
y = data1;                    % Your CP values go in this vector

NFFT = 2^nextpow2(L); % Next power of 2 from length of y
Y = fft(y,NFFT)/L;
f = Fs/2*linspace(0,1,NFFT/2);

% Plot single-sided amplitude spectrum.
loglog(f,2*abs(Y(1:NFFT/2))) 
title(' y(t)')
xlabel('Frequency (Hz)')
ylabel('|Y(f)|')

我认为我使用的代码可能有问题。我不知道是什么。

答案 6 :(得分:0)

我的一位同事为谱分析编写了一些很好的GPL许可函数:   http://www.mecheng.adelaide.edu.au/~pvl/octave/

更新:此代码现在是其中一个Octave模块的一部分:
  http://octave.svn.sourceforge.net/viewvc/octave/trunk/octave-forge/main/signal/inst/
但是从那里提取你需要的部分可能很棘手。)

它们是为Matlab和Octave编写的,主要用作信号处理工具箱中类似函数的替代品。 (所以code above应该仍然正常。)

它可能有助于您的数据分析;比使用fft之类的东西更好。