これは、何が起こるべきかを示す 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 軸を使用しているようです。また、セットなどで隣接する周波数ビンを平滑化することもできます。