3

私はfftを使用して曲からボーカルを削除するプログラムを作成します。C#の前に、Matlabで周波数を下げるアルゴリズムをテストすることにしましたが、例のように結果を得ることができません。ノイズがあります。任意の範囲(0.7〜1.5)を選択しようとしましたが、すべて同じです...ノイズ。私は何をしませんか?正しく書くのを手伝ってください)よろしくお願いします!

[y, fs] = wavread('Song.wav');
left = y(:,1);
right = y(:,2);
fftL = fft(left);
fftR = fft(right);

for i = 1:683550 %in my example 683550
  dif = fftL(i,1) / fftR(i,1);
  dif = abs(dif);
  if (dif > 0.7 & dif < 1.5)
    fftL(i,1) = 0;
    fftR(i,1) = 0;
  end;
end;

leftOut = ifft(fftL);
rightOut = ifft(fftR);
yOut(:,1) = leftOut;
yOut(:,2) = rightOut;

wavwrite(yOut, fs, 'tmp.wav');
4

1 に答える 1

1

コードから、周波数コンテンツが左右の強度が「等しい」場合(0.7と1.5の比率として定義される場合)、単純にボーカルとして分類されていることがわかります。このスキームの理由はよくわかりませんが、実際にはまともな結果が得られる可能性があります。

あなたが間違っていることは、おそらくfftサイズと、完全な信号を一度に処理しているという事実に関係しています。

たとえば曲のボーカルは時間とともに変化するため、マスキングも変化する必要があります。これが意味するのは、信号を時間領域のフレームに分割し、フレームごとに個別にfftとマスキングを実行する必要があるということです。また、時間領域フレーミングでオーバーラップを使用することを検討する必要があります。

よろしく

于 2013-01-22T15:45:44.463 に答える