Matlab FFT. 理解频率和结果之间的关系时遇到了困难。

6
我们正在尝试分析圆柱周围的流动,并且我们有一组Cp值,这些值是从风洞实验中得到的。最初,我们使用20 Hz的采样频率并尝试在Matlab中使用FFT找到涡 shedding 的频率。我们得到了大约7 Hz的频率。接下来,我们进行了相同的实验,但唯一改变的是采样频率-从20 Hz增加到200 Hz。我们发现涡 shedding 的频率约为70 Hz(这是图表中峰值所在的位置)。无论我们输入什么Cp数据,图形都不会改变。唯一不同的时间是当我们改变采样频率时,峰值才会有所不同。看起来涡 shedding 频率的增加与采样频率成正比,这似乎毫无意义。如何建立采样频率和涡 shedding 频率之间的关系,任何帮助都将不胜感激。
7个回答

11
您看到的问题与FFT的限制有关,由于FFT无法检测高于奈奎斯特频率(采样频率的一半)的频率,因此涉及到“数据别名”。
使用数据别名,实际频率的峰值将围绕(实际频率奈奎斯特频率)居中。在20 Hz采样中(假设70 Hz是真实频率),结果为零频率,这意味着您未看到真实信息。可以帮助您的一件事是使用FFT“窗口”。
您可能遇到的另一个问题与通过单个FFT测量生成嘈杂数据有关。最好收集大量数据,使用重叠的窗口,并确保至少有5个FFT,以平均得出结果。如Steven Lowe所提到的,如果可能的话,您还应该以更快的速度进行采样。我建议您以仪器能够采样的最快速率进行采样。
最后,我建议您阅读C语言数字计算方法(<--链接)的一些摘录。

您不需要阅读C源代码,只需阅读解释部分。 C语言数值计算方法书籍对该主题有很好的简明信息。

如果您有更多问题,请在评论中留言。 我会尽力回答。

祝好运!


4
这可能不是一个编程问题,听起来更像是实验测量问题。
我认为采样频率必须至少是振荡频率的两倍,否则会产生伪影;这可能解释了差异。请注意,FFT频率与采样频率的比率在两种情况下均为0.35。您能否使用更高的采样率重复实验?如果这是强风中的窄圆柱体,则可能振动/振荡速度比采样率能够检测到的速度更快。
希望这可以帮助您 - 我有97.6%的概率不知道我在说什么;-)

2
我想你需要在开始理解DFT(FFT)的所有细微差别之前进行一些严肃的数字信号处理阅读。如果我是你,我会先通过这本好书来打好基础:
《离散时间信号处理》
如果你想要更深入的数学处理,以扩展你的能力, Körner的傅里叶分析 可以提供更多帮助。

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 命令时必须明确传递采样频率才能输出“真实”的频率数据。否则,当更改采样频率时,共振发生的频率将似乎发生偏移,这类似于您描述的问题。

0

请看一下this相关的问题。虽然最初是关于VB的问题,但回答通常都是关于FFT的。


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,并且主要作为信号处理工具箱中类似函数的即插即用替代品。(因此,上述代码应该仍然可以正常工作。)

它可能对您的数据分析有所帮助;比使用fft等自己实现要好。


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)|')

我觉得我正在使用的代码可能有问题,但我不确定是什么问题。


最好编辑您的原始问题,而不是在其中发布一个新问题的“答案”。 - Will Robertson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接