我们正在尝试分析围绕圆柱体的流动,并且我们有一组从风洞实验中获得的 Cp 值。最初,我们以 20 Hz 的采样频率开始,并尝试在 matlab 中使用 FFT 找到涡旋脱落的频率。我们得到了大约 7 Hz 的频率。接下来,我们做了同样的实验,但我们唯一改变的是采样频率——从 20 Hz 到 200 Hz。我们得到涡旋脱落的频率约为 70 Hz(这是图中峰值所在的位置)。无论我们输入什么 Cp 数据,图表都不会改变。峰值不同的唯一时间是我们改变采样频率的时候。涡旋脱落频率的增加似乎与采样频率成正比,这似乎根本没有意义。
7 回答
您看到的问题与“数据混叠”有关,因为 FFT 能够检测到高于奈奎斯特频率(采样频率的一半)的频率的限制。
使用数据混叠,实际频率的峰值将以(实际频率模奈奎斯特频率)为中心。在您的 20 Hz 采样中(假设 70 Hz 是真实频率,这会导致频率为零,这意味着您没有看到真实信息。可以帮助您解决此问题的一件事是使用 FFT“窗口”。
您可能遇到的另一个问题与通过单 FFT 测量生成噪声数据有关。最好获取大量数据,使用重叠窗口,并确保您至少有 5 个 FFT,您平均可以找到您的结果。正如 Steven Lowe 所提到的,如果可能,您还应该以更快的速度进行采样。我建议以您的仪器可以采样的最快速度进行采样。
最后,我建议您阅读C 中的数字食谱的一些摘录(<-- 链接):
- 第 12.0 节——FFT 简介
- 第 12.1 节(讨论数据别名)
- 第 13.4 节(讨论 FFT 开窗)
您无需阅读 C 源代码——只需阅读说明即可。C 的数字食谱有关于这个主题的极好的浓缩信息。
如果您还有其他问题,请在评论中留下。我会尽力回答他们。
祝你好运!
这可能不是编程问题,听起来像是实验测量问题
我认为采样频率必须至少是振荡频率的两倍,否则你会得到伪影;这可能解释了差异。请注意,在这两种情况下,FFT 频率与采样频率的比率都是 0.35。你能用更高的采样率重复这个实验吗?我在想,如果这是一个在强风中的狭窄圆柱体,它的振动/振荡速度可能比采样率可以检测到的快。.
我希望这会有所帮助——有 97.6% 的可能性我不知道我在说什么;-)
如果这不是混叠问题,听起来您可以在归一化频率范围内绘制频率响应,该频率响应将随采样频率而变化。这是一个在 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
命令才能输出“真实”频率数据。否则,当您更改采样频率时,发生共振的 bin 似乎会发生变化,这与您描述的问题类似。
我认为您需要认真阅读数字信号处理,然后才能开始了解 DFT (FFT) 的所有细微差别。如果我是你,我会首先阅读这本好书:
如果你想要更多能够真正扩展你能力的数学处理,
看看这个相关的问题。虽然最初被问及关于 VB 的问题,但回答通常是关于 FFT
我尝试使用上面的频率响应代码,但似乎我在 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)|')
我认为我使用的代码可能有问题。我不确定是什么。
我的一位同事为频谱分析编写了一些很好的 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
。