2009-09-21 10 views
7

Sono interessato a produrre una frequenza di tono in fase di esecuzione con la frequenza e la durata che sono parametri variabili. Quale sarebbe il modo migliore per generare questo file audio in MATLAB e renderlo accessibile nello script per utilizzarlo in seguito per concatenarlo con altri file audio generati in modo simile per frequenze/durate diverse? Grazie in anticipo per i commenti.Come si generano le frequenze dual tone in MATLAB?

+0

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

risposta

19

La durata per la quale un determinato vettore verrà riprodotto dipende dal numero di elementi nel vettore e dalla frequenza di campionamento. Ad esempio, un vettore di 1000 elementi, se suonato a 1 kHz, durerà 1 secondo. Quando viene riprodotto a 500 Hz, durerà 2 secondi. Pertanto, la prima scelta da fare è la frequenza di campionamento che si desidera utilizzare. Per evitare aliasing, la frequenza di campionamento deve essere twice as large as the largest frequency component of the signal. Tuttavia, potrebbe essere necessario renderlo ancora più grande di quello per evitare l'attenuazione delle frequenze vicino alla frequenza di campionamento.

Data una frequenza di campionamento di 1 kHz, l'esempio seguente crea un suono vettore di una data frequenza la durata e il tono (utilizzando i LINSPACE e SIN funzioni):

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

Quando ha giocato a 1 kHz utilizzando il SOUND funzione, questo vettore genererà un tono di 50 Hz per 2 secondi:

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

il vettore può essere salvata come file wav utilizzando la funzione WAVWRITE:

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

Il vettore audio può essere successivamente caricato utilizzando la funzione WAVREAD. Se hai intenzione di concatenare due vettori sonori, dovresti assicurarti che siano entrambi progettati per utilizzare la stessa frequenza di campionamento.

+0

Devo specificare la frequenza nella variabile Fs? Mi piacerebbe avere un metodo sistematico di capire come generare un tono particolare allo stesso periodo di tempo però. Quali sarebbero i tuoi consigli su questo? – stanigator

+0

@stanigator: ho modificato il codice per renderlo più generale. Calcola il vettore del suono in base alla frequenza di campionamento, alla frequenza dei toni e alla durata. – gnovice

-1

Il codice di gnovice sembra essere difettoso. Penso che abbia incasinato la funzione linspace. Puoi verificarlo da te stesso confrontando la stessa frequenza con frequenze di campionamento diverse - il suono differisce, cosa che ovviamente non dovrebbe.

(che sono stupido. Quando si utilizza la funzione audio di Matlab, assicurarsi di utilizzare la stessa frequenza di campionamento che si è utilizzato per generare il tono. In caso contrario, dovrai un brutto momento.)


Ecco una funzione che avvolge la funzionalità di generazione toni.

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

I risultati del tuo codice e il mio codice sembrano identici. Ho appena testato il mio con frequenze di campionamento diverse per un numero di toni e non ho ricevuto l'errore che stai vedendo. Quali sono stati i parametri che stavi utilizzando che hanno provocato un errore? – gnovice

+0

Hai ragione. Si prega di consultare la mia modifica. – c06n

Problemi correlati