MATLABでの話です。
①ビルトインされているspectrogram関数
②自作コードによるspectrogram
上記2パターンで、プロットしたスペクトログラムが一致しません。
ビルトインの方が、見た目が荒く、周波数分解能が高く見えます。
(両者の値そのものが異なっている(ビルトインの方は-150dB ~ -50dB、自作の方は-80dB ~ +10dB)事も気にはなっているのですが、直接は関係ないと認識しております。)
どなたか、原因を見つけられる方はおりませんでしょうか?
よろしくお願いいたします。
①ビルトインされているspectrogram関数
MATLAB
1[x, fs] = audioread(filename); 2nfft = 128; 3window = rectwin(nfft); 4noverlap = nfft * 0; 5spectrogram(x, window, noverlap, nfft, fs, 'yaxis'); 6colormap hot
②自作コードによるspectrogram
MATLAB
1[x, fs] = audioread(filename); 2 3sample_length = length(x)/fs; 4nfft = 128; 5window = rectwin(nfft); 6noverlap = nfft * 0; 7J = fix((length(x)-noverlap) / (nfft-noverlap)); 8 9S = zeros(nfft/2+1, J); 10 11for jj = 1 : J 12 y = x(1 + (jj-1) * nfft : jj * nfft)'; 13 14 % 矩形窓をかけている部分は形式的なものなので特に何もしていません。 15 ydft = fft(y) .* rectwin(nfft)'; 16 17 % 絶対値のlogを取っています。 18 YDFT = abs(ydft); 19 YDFT = 10*log10(YDFT); 20 21 % FFTの出力が、正負の周波数に分布しているので、 22 % 正の周波数と0[Hz]成分(0[Hz]~64[Hz])のデータだけ取り出しています。 23 YDFT = YDFT(1:length(ydft)/2+1); 24 25 % 取り残された負の周波数(-64[Hz]~-1[Hz])のエネルギーを、 26 % 取り出した正の周波数に組み入れる為に、2倍しています。 27 YDFT(2:end-1) = 2 * YDFT(2:end-1); 28 29 S(:, jj) = YDFT; 30end 31 32% スペクトログラムをsurf関数でプロットする為に、周波数軸のグリッドを作っています。 33F = 0 : (fs/2)/(nfft/2) : fs/2; 34 35% スペクトログラムをsurf関数でプロットする為に、時間軸のグリッドを作っています。 36T = sample_length/J : sample_length/J : sample_length; 37 38surf(T, F, S, 'EdgeColor', 'flat', 'FaceColor', 'interp', 'FaceLighting', 'none') 39axis xy; axis tight; colormap(hot); view(2); colorbar; 40 41c.Label.String = 'Power / frequency [dB / Hz]'; 42xlabel('Time'); 43ylabel('Frequency (Hz)');
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。