2009-09-21 4 views
7

Je suis intéressé par produire une fréquence de tonalité à l'exécution avec la fréquence et la durée étant des paramètres variables. Quel serait le meilleur moyen de générer ce fichier son dans MATLAB et de le rendre accessible dans le script pour être ensuite concaténé avec d'autres fichiers audio générés de manière similaire pour différentes fréquences/durées? Merci d'avance pour les commentaires.Comment générer des fréquences bi-ton dans MATLAB?

+0

http://www.mathworks.com/help/techdoc/ref/sound.html –

Répondre

19

La durée de lecture d'un vecteur dépend du nombre d'éléments dans le vecteur et de la fréquence d'échantillonnage. Par exemple, un vecteur de 1000 éléments, lorsqu'il est joué à 1 kHz, durera 1 seconde. Lorsqu'il est joué à 500 Hz, il durera 2 secondes. Par conséquent, le premier choix que vous devriez faire est le taux d'échantillonnage que vous voulez utiliser. Pour éviter aliasing, la fréquence d'échantillonnage doit être twice as large as the largest frequency component of the signal. Cependant, vous pouvez vouloir le rendre encore plus grand que cela pour éviter l'atténuation des fréquences proches de la fréquence d'échantillonnage.

Compte tenu d'un taux d'échantillonnage de 1 kHz, l'exemple suivant crée un vecteur sonore d'une durée donnée et la fréquence de tonalité (en utilisant les fonctions LINSPACE et SIN):

Fs = 1000;  %# Samples per second 
toneFreq = 50; %# Tone frequency, in Hertz 
nSeconds = 2; %# Duration of the sound 
y = sin(linspace(0, nSeconds*toneFreq*2*pi, round(nSeconds*Fs))); 

Lors de la lecture à 1 kHz en utilisant la SOUND fonction, ce vecteur va générer une tonalité de 50 Hz pendant 2 secondes:

sound(y, Fs); %# Play sound at sampling rate Fs 

le vecteur peut alors être enregistré en tant que fichier wav en utilisant la fonction WAVWRITE:

wavwrite(y, Fs, 8, 'tone_50Hz.wav'); %# Save as an 8-bit, 1 kHz signal 

Le son vecteur peut ensuite être chargé à l'aide de la fonction WAVREAD. Si vous voulez concaténer deux vecteurs sonores, vous devez vous assurer qu'ils sont tous deux conçus pour utiliser la même fréquence d'échantillonnage.

+0

Est-ce que je spécifie la fréquence dans la variable Fs? Je voudrais avoir une méthode systématique pour déterminer comment générer un ton particulier à la même période. Quelles seraient vos recommandations à ce sujet? – stanigator

+0

@stanigator: J'ai révisé le code pour le rendre plus général. Il calcule le vecteur sonore en fonction de la fréquence d'échantillonnage, de la fréquence de tonalité et de la durée. – gnovice

-1

Le code de gnovice semble être défectueux. Je pense qu'il a chamboulé la fonction du linspace. Vous pouvez le vérifier vous-même en comparant la même fréquence avec différentes fréquences d'échantillonnage - le son diffère, ce qui ne devrait évidemment pas être le cas.

(je suis stupide. Lorsque vous utilisez la fonction de son Matlab, assurez-vous d'utiliser la même fréquence d'échantillonnage que vous avez utilisé pour générer le ton. Sinon, tu vas avoir un mauvais moment.)


Voici une fonction qui complète la fonctionnalité de génération de tonalité.

function pureTone (frequency, duration, amplitude, sampleFreq, save2file) 
% Generate pure tones. 
% Enter at least 1 argument. 
% Defaults are: 
% duration 1 sec 
% amplitude 1 
% sampleFreq 48000 Hz 
% save2file no 
%-------------------- 
% If you want to save the tone to a file, provide a name.  

switch nargin 
case 0 
    error('Enter a frequency.') 
case 1 
    duration = 1; 
    amplitude = 1; 
    sampleFreq = 48000; 
    save2file = 0; 
case 2 
    amplitude = 1; 
    sampleFreq = 48000; 
    save2file = 0; 
case 3 
    sampleFreq = 48000; 
    save2file = 0; 
case 4 
    save2file = 0; 
end 


t = linspace(0, duration, duration * sampleFreq); 
% http://de.wikipedia.org/wiki/Sinuston 
s = amplitude * sin(2 * pi * frequency * t); 

sound(s, sampleFreq); 

if save2file 
    wavwrite(s, sampleFreq, 32, save2file); 
end 

end 
+1

Les résultats de votre code et mon code semblent être identiques. Je viens de tester le mien avec différentes fréquences d'échantillonnage pour un certain nombre de tons et n'a pas eu l'erreur que vous voyez. Quels sont les paramètres que vous utilisiez qui ont entraîné une erreur? – gnovice

+0

Vous avez raison. S'il vous plaît voir mon edit. – c06n

Questions connexes