0

私は、ステップの 1 つがフーリエ変換を取得することである (潜在的に非常に単純な) 割り当てに取り組んできました。ここにある波音を変換するために大学のガイドに従っています(チャンネル: 2、サンプル: 17600、サンプル周波数: 16KHz)。

グラフを見ると、うまくいっているようです。

[y,fs,wmode,fidx]=readwav('piano.wav','r',-1,0);
left=y(:,1);
amountOfSlices = 6;
samplesPerSlice = fix(length(left) / 6);
frames=enframe(left, samplesPerSlice);
frames=transpose(frames);
fftdata=rfft(frames);
fftdata=fftdata.*conj(fftdata);
plot(fftdata);

チュートリアル FFT

次に、チュートリアル コードをベースとしてコード ファイルを作成し、受け入れパラメーターを追加しました (これらは割り当てに必要ですが、簡潔にするために省略されています)。

samplerate = 512;
% Read the file with raw unscaled audio data from begin to end
[multiData,fs,wmode,fidx]=readwav(filename,'r',-1,0);
disp(sprintf('Number of channels: %d', fidx(5)))
disp(sprintf('Number of samples: %d', fidx(4)))
disp(sprintf('Sample frequency: %d Hz', fs))

% Extract the left channel of the data
leftData = multiData(:, 1);

% Slice the left channel into pieces of the size of 'samplerate'
samplesPerSlice = samplerate

% Splits the leftData vector up into frames of length equal to sample rate
slicedLeftData = enframe(leftData, samplerate)';

% Apply the real data fast fourrier transformation on each data slice
fftdata=rfft(slicedLeftData);
fftdata=fftdata.*conj(fftdata);

plot(fftdata);

代入FFT

ここで私が何を間違っているのか分かりますか?

私の実際の質問は: 2 番目のデータが 0 ~ 16.000 Hz の周波数領域にないのはなぜですか? 私は何を間違っていますか?

4

1 に答える 1

1

「ここで何が問題なのか」とは、複数の色を意味していると思いますか? もしそうなら、両方の画像の fftdata plottet が行列のように見えます (配列が必要ですか?)。.* はすべての要素に対して操作を実行しませんか? 入力引数の寸法を確認してください。

さらに、ナイキストの定理を思い出してください。サンプル周波数の半分を超える周波数を分解することはできません。サンプル周波数が 16KHz の場合、8kHz を超えるデータポイントが存在する可能性がありますが、それには情報が含まれていないため、周波数ドメイン プロットに含める必要はありません。

于 2012-10-26T15:09:44.093 に答える