1

問題のコンテキストは次のとおりです。wav 形式の DTMF 信号があり、エンコードされた数列を特定する必要があります。Matlab で高速フーリエ変換を使用してそうする必要があります。これは、40 ミリ秒wavread以上の無音で区切られた各数値を識別するために と を使用して wav ファイルを読み取ることを意味します。

これまでの私のコードは次のとおりです。

[signal, fs] = wavread( 'C:\Temp\file.wav' );  % here, fs = 8000Hz

N = 512;                    
T = 1/fs;                   
L = length( signal )        
samples = fs / 1000 * 40    
windows = floor(L / samples) 
t = (1:L)/fs;

figure(1), plot(t, signal);

これはfigure 1、wav から読み取られた信号です。 ここに画像の説明を入力

対応する数値をデコードするために、10 個の断片のそれぞれに対して個別に FFT を実行できるように、信号を断片に効果的に分割するにはどうすればよいですか?

4

2 に答える 2

0

次のアプローチをお勧めします。

  • 時間領域で信号の包絡線を見つけます (ヒルベルト変換を参照)。
  • 封筒を少し滑らかにします。
  • 差分を取ってピークを見つけ、トーンの始まりを取得します。
  • オンセットを使用してフレームを選択し、fft を使用してスペクトルを見つけます。
  • 各スペクトルの最大値のインデックスを見つけて、それらを周波数に変換します。

ここで注意が必要なのは、ポイント 3 で堅牢な開始検出器を取得することです。選択した差のピークは、開始と見なすために特定のサイズでなければなりません。トーンがさまざまな強さである場合、これは問題になる可能性がありますが、時報のイメージからは問題のようには見えません。

よろしく

于 2013-01-24T06:59:41.917 に答える
0

これは私のために働いた:

windowSize = 256;   
nbWindows = floor(L / windowSize);

for i=1:nbWindows
    coeffs = fft(signal((i-1)*windowSize+1:i*windowSize));    
    plot(abs(coeffs(1:N)));
    waitforbuttonpress
end;

このようにして、入力信号の最後までウィンドウをシフトすることができます

于 2013-01-31T19:51:37.490 に答える