所以,我一直在为声音文件制作一个小型可视化工具,只是为了好玩。我基本上想模仿Windows Media Player中的“Scope”和“Ocean Mist”可视化器。范围很简单,但我遇到了Ocean Mist的问题。我很确定它是某种频谱,但是当我对波形数据进行FFT时,我得不到与Ocean Mist显示的数据相对应的数据。频谱实际上看起来是正确的,所以我知道FFT没有任何问题。我假设可视化器通过某种过滤器运行光谱,但我不知道它可能是什么。有什么想法吗?
EDIT2: 我发布了我的代码here的编辑版本。通过编辑,我的意思是我删除了所有实验性评论,只留下了活动代码。我还添加了一些描述性的评论。可视化工具现在看起来像this。
编辑: 这是图像。第一个是我的可视化器,第二个是Ocean Mist。
my visualizer http://i43.tinypic.com/5xuyqa.jpg ocean mist http://i41.tinypic.com/f1bb04.jpg
答案 0 :(得分:6)
这是一些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
我让Octave处理从线性到log x和y轴的缩放。对于像正弦波这样的简单波形,你能得到类似的东西吗?
OLD ANSWER
我不熟悉你提到的可视化工具,但总的来说:
答案 1 :(得分:3)
通常对于这类事情,您希望将FFT输出转换为功率谱,通常采用对数(dB)幅度标度,例如:对于给定的出纸槽:
p = 10.0 * log10 (re * re + im * im);
答案 2 :(得分:1)
它绝对看起来像海洋雾Y轴是对数。
答案 3 :(得分:1)
似乎不仅y轴,而且x轴也是对数。峰值之间的距离似乎在较高频率处较低。