因此,我一直在为声音文件开发一个可视化工具,只是为了好玩。我基本上想模仿Windows Media Player中的“Scope”和“Ocean Mist”可视化工具。范围很简单,但是我遇到了Ocean Mist的问题。我很确定这是某种频谱,但是当我对波形数据执行FFT时,我没有得到与Ocean Mist显示的数据相对应的数据。频谱实际上看起来是正确的,所以我知道FFT没问题。我假设可视化器通过某种滤波器运行频谱,但我不知道它可能是什么。有任何想法吗?

编辑2:
我在这里发布了代码的编辑版本(编辑者的注意:链接不再起作用)。通过编辑,我的意思是我删除了所有实验注释,只保留了 Activity 代码。我还添加了一些描述性评论。现在,可视化器看起来像this

编辑:
这是图像。第一个是我的可视化器,第二个是海洋雾。

audio - 标准化FFT幅度以模仿WMP-LMLPHP

audio - 标准化FFT幅度以模仿WMP-LMLPHP

最佳答案

这是一些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

结果如下图所示:
top: regular spectral plot, bottom: loglog spectral plot (blue is unwindowed) http://img710.imageshack.us/img710/3994/spectralplots.png

我让Octave处理从线性到对数的x和y轴的缩放。对于像正弦波这样的简单波形,您得到类似的结果吗?

旧答案

我不熟悉您提到的展示台,但总的来说:
  • 光谱通常使用对数y轴(或光谱图的色图)显示。
  • 您的FFT可能正在返回双面频谱,但是您可能只想使用前半部分(看起来您已经在做)。
  • 在您的时间数据上应用window function可以通过减少泄漏来使频谱峰变窄(看起来您也正在这样做)。
  • 如果您关注绝对大小,则可能需要按变换块大小进行划分(我想在您的情况下并不重要)。
  • 似乎Ocean Mist可视化工具也在使用对数x轴。它还可能会平滑集合中的或某些附近的频率仓。
  • 10-08 06:45