6

我们正在尝试分析围绕圆柱体的流动,并且我们有一组从风洞实验中获得的 Cp 值。最初,我们以 20 Hz 的采样频率开始,并尝试在 matlab 中使用 FFT 找到涡旋脱落的频率。我们得到了大约 7 Hz 的频率。接下来,我们做了同样的实验,但我们唯一改变的是采样频率——从 20 Hz 到 200 Hz。我们得到涡旋脱落的频率约为 70 Hz(这是图中峰值所在的位置)。无论我们输入什么 Cp 数据,图表都不会改变。峰值不同的唯一时间是我们改变采样频率的时候。涡旋脱落频率的增加似乎与采样频率成正比,这似乎根本没有意义。

4

7 回答 7

11

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

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

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

最后,我建议您阅读C 中的数字食谱的一些摘录(<-- 链接):

您无需阅读 C 源代码——只需阅读说明即可。C 的数字食谱有关于这个主题的极好的浓缩信息。

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

祝你好运!

于 2008-10-05T05:57:07.530 回答
4

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

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

我希望这会有所帮助——有 97.6% 的可能性我不知道我在说什么;-)

于 2008-10-05T02:17:05.070 回答
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命令才能输出“真实”频率数据。否则,当您更改采样频率时,发生共振的 bin 似乎会发生变化,这与您描述的问题类似。

于 2008-10-05T09:39:44.630 回答
2

我认为您需要认真阅读数字信号处理,然后才能开始了解 DFT (FFT) 的所有细微差别。如果我是你,我会首先阅读这本好书:

离散时间信号处理

如果你想要更多能够真正扩展你能力的数学处理,

Körner 的傅里叶分析

于 2009-04-02T14:49:32.433 回答
0

看看这个相关的问题。虽然最初被问及关于 VB 的问题,但回答通常是关于 FFT

于 2008-10-05T02:05:55.810 回答
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)|')

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

于 2008-10-07T00:03:09.427 回答
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

于 2008-10-07T07:04:10.717 回答