2017-03-09 99 views
1

我正在試圖爲語音信號(.wav)添加一個噪聲文件(.wav)文件。在matlab中添加不同採樣率的語音

[b fs]=audioread('AzBio_01-01_S60.wav'); 
[babble fs1]=audioread('cafeteria_babble.wav'); 

的問題是,這兩個文件具有不同的採樣率(FS = 22050,FS1 = 44100)。

當我添加它們會扭曲另一個信號,因爲採樣率不同。我如何解決這個問題。我通過

p=audioplayer (total,fs) 
    play (p) 

回答

2

失真會播放聲音,由於樣本值相加超過1倍不是採樣率的差異。爲了處理這個風險,在將它們相加之前將兩個向量除以2。

也就是說,你仍然需要處理採樣率差異。有兩種方法可以做到這一點:或者以較高的採樣率降低信號的採樣率,或者提高另一個信號的採樣率。

減少與更高速率的信號的採樣率是更容易,但附帶了一個你實際上丟失數據的缺點。你可以通過使用resample來做到這一點。 resample(babble, fs, fs1)

或者,也可以上採樣具有較低採樣頻率的信號。這不會給你更多的數據,但它意味着採樣率相匹配。你可以用interp1來做到這一點。 b = interp1(1:length(b),b,0.5:0.5:length(b))

因此,在總結

[b fs]=audioread('AzBio_01-01_S60.wav'); 
[babble fs1]=audioread('cafeteria_babble.wav'); 
b = interp1(1:length(b),b,0.5:0.5:length(b)); % interpolate b to fs1 
total = b/2 + babble/2; % sum at half the sample values 
p=audioplayer (total,fs1); 
play (p) 
+2

爲了避免混淆,最好通過'resample'下采樣,而不是僅僅以一半的樣本。另外,我認爲你有一個錯字:你提到'interp1',但不要使用它。 (注意''resample''也可以用來代替'interp1') –

+0

謝謝,我已經編輯過把interp1放到我想要的代碼中。你對重採樣和別名也是對的。 – tobassist

+1

我用resample和它的工作。我的代碼的最終形式看起來有點不同,但你會明白: [babble fsbab] = audioread('babble.wav'); [caffeteria fscaf] = audioread('caffeteria.wav'); [P,Q] =大鼠(fscaf/fsbab); babble_new = resample(babble,P,Q); audiowrite('babble.wav',babble_new,fscaf); [babble fs1] = audioread('babble.wav'); [caffeteria fs1] = audioread('caffeteria.wav'); –