2009-09-21 18 views
7

estoy interesado en producir una frecuencia de tono en tiempo de ejecución con la frecuencia y duración de ser parámetros variables. ¿Cuál sería la mejor manera de generar este archivo de sonido en MATLAB y tiene accesible en la secuencia de comandos para su uso posterior para ser concatenado con otros archivos de sonido generadas de una manera similar para diferentes frecuencias/duraciones? Gracias de antemano por los comentarios.¿Cómo se generan frecuencias de tono dual en MATLAB?

+0

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

Respuesta

19

La duración para la que jugará un vector dado depende del número de elementos en el vector y la velocidad de muestreo. Por ejemplo, un vector de 1000 elementos, cuando se juega a 1 kHz, durará 1 segundo. Cuando se reproduce a 500 Hz, durará 2 segundos. Por lo tanto, la primera elección que debe hacer es la tasa de muestreo que desea usar. Para evitar aliasing, la frecuencia de muestreo debe ser twice as large as the largest frequency component of the signal. Sin embargo, es posible que desee hacerlo incluso más grande que eso para evitar la atenuación de frecuencias cercanas a la frecuencia de muestreo.

Dada una tasa de muestreo de 1 kHz, el siguiente ejemplo se crea un vector de sonido de una frecuencia de la duración y el tono dado (utilizando los LINSPACE y SIN funciones):

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))); 

Cuando se juega a 1 kHz utilizando el SOUND función, este vector generará un tono de 50 Hz durante 2 segundos:

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

el vector entonces se puede guardar como un archivo WAV utilizando la función WAVWRITE:

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

El vector de sonido más tarde se puede cargar mediante la función WAVREAD. Si va a concatenar dos vectores de sonido, debe asegurarse de que estén diseñados para usar la misma frecuencia de muestreo. código

+0

¿Especifico la frecuencia en la variable Fs? Sin embargo, me gustaría tener un método sistemático para descubrir cómo generar un tono particular en el mismo período de tiempo. ¿Cuáles serían sus recomendaciones sobre eso? – stanigator

+0

@stanigator: Revisé el código para hacerlo más general. Calcula el vector de sonido dada la frecuencia de muestreo, la frecuencia del tono y la duración. – gnovice

-1

de gnovice parece ser defectuoso. Creo que arruinó la función linspace. Puede verificarlo usted mismo al comparar la misma frecuencia con diferentes frecuencias de muestreo: el sonido difiere, lo cual obviamente no debería ser.

(soy estúpida. Cuando se utiliza la función de sonido de Matlab, asegúrese de utilizar la misma frecuencia de muestreo que se utilizó para generar el tono. De lo contrario, vas a tener un mal momento.)


Aquí es una función que envuelve la funcionalidad de generación de tonos.

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

Los resultados de su código y mi código parecen ser idénticos. Acabo de probar el mío con diferentes frecuencias de muestreo para varios tonos y no obtuve el error que está viendo. ¿Cuáles fueron los parámetros que estaba usando que resultaron en un error? – gnovice

+0

Tienes razón. Por favor mira mi edición. – c06n

Cuestiones relacionadas