这是一些 Octave 代码,显示了我认为应该发生的事情。我希望语法是不言自明的:
%# First generate some test data
%# make a time domain waveform of sin + low level noise
N = 1024;
x = sin(2*pi*200.5*((0:1:(N-1))')/N) + 0.01*randn(N,1);
%# Now do the processing the way the visualizer should
%# first apply Hann window = 0.5*(1+cos)
xw = x.*hann(N, 'periodic');
%# Calculate FFT. Octave returns double sided spectrum
Sw = fft(xw);
%# Calculate the magnitude of the first half of the spectrum
Sw = abs(Sw(1:(1+N/2))); %# abs is sqrt(real^2 + imag^2)
%# For comparison, also calculate the unwindowed spectrum
Sx = fft(x)
Sx = abs(Sx(1:(1+N/2)));
subplot(2,1,1);
plot([Sx Sw]); %# linear axes, blue is unwindowed version
subplot(2,1,2);
loglog([Sx Sw]); %# both axes logarithmic
结果如下图:
顶部:常规光谱图,底部:loglog 光谱图(蓝色未加窗)http://img710.imageshack.us/img710/3994/spectralplots.png
我让 Octave 处理从线性到对数 x 和 y 轴的缩放。对于像正弦波这样的简单波形,您是否得到类似的东西?
旧答案
我不熟悉您提到的可视化工具,但总的来说:
- 光谱通常使用对数 y 轴(或光谱图的颜色图)显示。
- 您的 FFT 可能会返回双面频谱,但您可能只想使用前半部分(看起来您已经在使用)。
- 将窗函数应用于您的时间数据,通过减少泄漏(看起来您也在这样做)使光谱峰变窄。
- 如果您关心绝对幅度,您可能需要除以变换块大小(我想在您的情况下并不重要)。
- 看起来 Ocean Mist 可视化工具也在使用对数 x 轴。它也可能在集合中平滑相邻的频率区间或其他东西。