2017-03-09 2 views
1

J'essaie d'ajouter un fichier de fichier de bruit (.wav) à un signal de parole (.wav).Ajouter du bruit à la parole avec différentes fréquences d'échantillonnage dans matlab

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

Le problème est que les deux fichiers ont des fréquences d'échantillonnage différentes (fs = 22050, fs1 = 44100). Quand je les ajoute, cela déforme l'autre signal car la fréquence d'échantillonnage est différente. Comment puis-je résoudre ceci. Je joue le son via

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

Répondre

2

La distorsion sera due aux valeurs d'échantillon cumulant plus de 1 pas les différences de fréquence d'échantillonnage. Pour faire face à ce risque, divisez les deux vecteurs par deux avant de les additionner. Cela dit, vous devez toujours gérer la différence de fréquence d'échantillonnage. Il y a deux façons de procéder: soit réduire la fréquence d'échantillonnage du signal avec le taux d'échantillonnage le plus élevé, soit augmenter la fréquence d'échantillonnage de l'autre signal.

La réduction de la fréquence d'échantillonnage du signal avec le débit le plus élevé est plus facile, mais présente l'inconvénient de perdre des données. Vous pouvez le faire en utilisant resample. resample(babble, fs, fs1)

Vous pouvez également suréchantillonner le signal avec la fréquence d'échantillonnage inférieure. Cela ne vous donnera plus de données mais cela signifiera que les taux d'échantillonnage correspondent. Vous pouvez le faire avec interp1. b = interp1(1:length(b),b,0.5:0.5:length(b))

Donc, en résumé

[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

Pour éviter l'aliasing il est préférable de sous-échantillonner via 'resample', plutôt que de prendre la moitié des échantillons. Aussi, je pense que vous avez une faute de frappe: vous mentionnez 'interp1' mais ne l'utilisez pas. (Notez que 'resample' pourrait aussi être utilisé à la place de' interp1') –

+0

Merci, j'ai modifié pour mettre interp1 dans le code où j'avais l'intention. Vous avez raison sur le rééchantillonnage et l'alias. – tobassist

+1

J'ai utilisé le rééchantillonnage et cela a fonctionné. La forme finale de mon code est un peu différente mais vous aurez l'idée: [babble fsbab] = audioread ('babble.wav'); [caffeteria fscaf] = audioread ('caffeteria.wav'); [P, Q] = rat (fscaf/fsbab); Babel_new = rééchantillonner (babiller, P, Q); audiowrite ('babble.wav', babble_new, fscaf); [babble fs1] = audioread ('babble.wav'); [caffeteria fs1] = audioread ('caffeteria.wav'); –