2013-01-22 106 views
3

我使用fft編寫了從歌曲中刪除歌曲的程序。在C#之前,我決定在Matlab中測試減少頻率的算法,但不能像例子那樣得到結果。有噪音。我試過選擇任何範圍(0.7 - 1.5),但都是一樣的...噪音。我不是? 請幫我寫一下吧)提前致謝!Matlab去除人聲

[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'); 
+0

+1涼爽項目 – PinkElephantsOnParade

+3

我認爲這更多的是[dsp.stackexchange.com(http://dsp.stackexchange.com/)這類問題的... –

+0

用戶有現在移動它自己:http://dsp.stackexchange.com/questions/7597/matlab-removing-vocals –

回答

1

從代碼我可以看到,你只需頻率內容分類爲有聲,如果它是在左,右之間強度「等於」(等於在0.7和1.5之間被限定爲比)。我不太瞭解這個方案的理由,但它可能會產生一個不錯的結果。

你在做什麼錯誤很可能與fft大小有關,而且你一直在處理完整信號的事實,可以這麼說。

例如,一首歌隨着時間而變化,因此你的掩飾也必須改變。這意味着你必須在時域中分解幀中的信號,並對每幀分別進行fft和掩碼處理。你也應該考慮在你的時域框架中使用重疊。

問候

+1

除了上述所有要點之外,還需要[Windowing](http://en.wikipedia.org/wiki/Window_function)將相鄰頻率較高的頻率之間的出血量降至最低。在時間和頻率分辨率之間有一個明顯的折衷,可以避免對瞬態造成的污穢。上面的OP代碼是極端的! 理由是人聲經常被放到中心位置,而樂器則更傾向於放在另一側。這不是一個特別強大的假設,而且有很多不是這樣的程序材料。 – marko

+1

非常感謝你!隨着窗口和框架大小,它的作品非常好! – SergeyLazarev

+1

非常酷。希望聽到一個例子:-)如果你有時間,可以隨意上傳一個預處理和後處理的例子到Youtube或類似的地方,並在這裏發佈一個鏈接。 – KlausCPH