Как вы генерируете двухтональные частоты в MATLAB? - PullRequest
7 голосов
/ 21 сентября 2009

Я заинтересован в создании частоты тона во время выполнения, причем частота и длительность являются переменными параметрами Каков наилучший способ создания этого звукового файла в MATLAB, и чтобы он был доступен в сценарии для последующего использования для объединения с другими звуковыми файлами, сгенерированными аналогичным образом для разных частот / длительностей? Заранее спасибо за комментарии.

Ответы [ 2 ]

19 голосов
/ 21 сентября 2009

Продолжительность воспроизведения данного вектора зависит от количества элементов в векторе и частоты дискретизации. Например, вектор из 1000 элементов при воспроизведении с частотой 1 кГц будет длиться 1 секунду. При воспроизведении с частотой 500 Гц он будет длиться 2 секунды. Следовательно, первый выбор, который вы должны сделать, - это частота дискретизации, которую вы хотите использовать. Чтобы избежать алиасинга , частота дискретизации должна быть в два раза больше, чем наибольшая частотная составляющая сигнала . Однако вы можете захотеть сделать его еще больше, чтобы избежать затухания частот, близких к частоте дискретизации.

При частоте дискретизации 1 кГц в следующем примере создается звуковой вектор заданной длительности и частоты тона (с использованием функций LINSPACE и 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)));

При воспроизведении на частоте 1 кГц с использованием функции SOUND этот вектор будет генерировать звук частотой 50 Гц в течение 2 секунд:

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

Вектор можно затем сохранить в виде файла WAV с помощью функции WAVWRITE :

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

Вектор звука можно позже загрузить с помощью функции WAVREAD . Если вы собираетесь объединить два звуковых вектора, убедитесь, что они оба рассчитаны на одинаковую частоту дискретизации.

0 голосов
/ 21 августа 2012

код gnovice, похоже, неисправен. Я думаю, что он испортил функцию linspace. Вы можете проверить это самостоятельно, сравнивая одну и ту же частоту с разными частотами дискретизации - звук отличается, чего, очевидно, и не должно быть.

(Я тупой. При использовании звуковой функции Matlab обязательно используйте ту же частоту сэмплирования, которую вы использовали для генерации тона. В противном случае у вас будет плохое время.)


Вот функция, которая оборачивает функциональность генерации тона.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...