2009-09-21 16 views
7

周波数と持続時間を可変パラメータとし、実行時にトーン周波数を生成することに興味があります。このサウンドファイルをMATLABで生成する最良の方法は何でしょうか?後で使用するためにスクリプトでアクセス可能にして、別の周波数/継続時間で同様の方法で生成された他のサウンドファイルと連結しますか?コメントには事前に感謝します。MATLABでデュアルトーン周波数をどのように生成しますか?

+0

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

答えて

19

ベクトルの再生時間は、ベクトルの要素数とサンプリングレートによって決まります。たとえば、1000要素のベクトルを1 kHzで再生すると、1秒間持続します。 500 Hzで再生すると、2秒間続きます。したがって、最初に選択する必要があるのは、使用するサンプリングレートです。 aliasingを回避するには、サンプリングレートはtwice as large as the largest frequency component of the signalである必要があります。ただし、サンプリングレートに近い周波数の減衰を避けるために、それをさらに大きくすることもできます。 1キロヘルツのサンプリングレート、次の例では、(LINSPACESIN関数を使用して)指定された持続時間およびトーン周波数の音ベクトルを作成考える

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

SOUNDを使用して1kHzで再生する場合機能、このベクターは2秒間50Hzのトーンを生成します。

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

ベクターは、次にWAVWRITE関数を使用して、WAVファイルとして保存することができる。

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

サウンドベクターは、WAVREAD機能を使用して後で読み込むことができます。 2つのサウンドベクトルを連結する場合は、両方が同じサンプリングレートを使用するように設計されていることを確認する必要があります。

+0

Fs変数に頻度を指定しますか?私は同じ時間に特定のトーンを生成する方法を考え出す体系的な方法を持っていたいと思います。それについてあなたの推奨は何ですか? – stanigator

+0

@stanigator:より一般的にするためにコードを改訂しました。サンプリング周波数、トーン周波数、および継続時間を指定してサウンドベクトルを計算します。 – gnovice

-1

gnoviceのコードに問題があるようです。私は彼がlinspace-functionを乱したと思う。同じ周波数をさまざまなサンプリング周波数と比較するときは、自分で確認できます。音は異なりますが、明らかに違うはずはありません。

(私は愚かだ。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 
+1

あなたのコードと私のコードの結果は同じです。私はちょうど私の音をいくつかの異なるサンプリング周波数でテストし、あなたが見ているエラーを取得しませんでした。使用していたパラメータがエラーになったのは何ですか? – gnovice

+0

あなたは正しいです。私の編集を見てください。 – c06n

関連する問題