0

これは、一部の人にとっては簡単な質問のように思えるかもしれませんが、私は信号処理にあまり詳しくありません。

そこで、MATLAB で純音を生成する簡単なコードをいくつか見つけました。

Fs = 44100;
duration = 5.0;

numberOfSamples = Fs * duration;
samples = (1:numberOfSamples) / Fs;
s = sin(2 * pi * freq * samples);

sound(s, Fs);

ここで音量をdB単位で調整できるようにしたいと思います。dbOffsetより正確には、キャリブレーション後にトーンの大きさを決定する特定のパラメーター、たとえば を導入したいと思います。

dbOffset = 0例:トーンが 50 dB になるようにキャリブレーションした場合dbOffset = 10、60 dB になるようにしたいなどです。

これは可能ですか?誰でもこれで私を助けてもらえますか?

どうもありがとう。

4

2 に答える 2

4

音の強さ(つまり、音の大きさ)は、音波の振幅によって決まります。サインの振幅を増減するには、サインにスケール係数を掛ける必要があります。一般的に言えば:

 A*sin(2*pi*f)

ピーク値(したがって振幅)がA、周波数がfHzの正弦波を生成します。もちろん、それは継続的な世界です。

とはいえ、音の強さを制御するには、一定の値を掛ける必要があります。

次に、関数がどのようにsound機能するかを確認する必要があります。公式ドキュメントから:

サウンド関数は、yに-1から1までの浮動小数点数が含まれていることを前提とし、その範囲外の値をクリップします。

これは大まかに次のように解釈されます。振幅yが1に等しい場合、サウンドカードは可能な限り大きな音を発します。おっと、問題が発生しました。実際の音の強さは、主にサウンドカードとPCに接続されているスピーカーに依存します...したがって、デシベル単位で音を吐き出す一般的な機能を作成するのはそれほど簡単ではありません...

コンセプトを試して、それに慣れたい場合は、次のことを試してください。

Fs = 44100;
duration = 2.0;

numberOfSamples = Fs * duration;
samples = (1:numberOfSamples) / Fs;
s = sin(2 * pi * freq * samples);
s2 = 0.5*sin(2*pi*freq*samples);

sound(s, Fs);
sound(s2,Fs);

これにより、最初に再生されたもののピーク値の半分のピーク値を持つサウンドが作成されます。それは、それが半分の強度、またはより良い用語を使用すると、パワーを持っていることを意味するものではありません。正弦波のパワーはその振幅と直線的には関係ありませんが、それはまったく別の話です。

要するに、あなたがやりたいことをするためには、音の再生に関係するシステム全体を知る必要があり、パワーを計算するためのいくつかの物理学を知る必要があります。正弦波に計算された定数を掛けて、指定された強度の音波を再生するコードを記述します:)

于 2012-04-04T15:05:21.737 に答える
3

おそらく知っておく必要があるのは、20 dB が係数 10 に等しいということだけです。つまり、

dB = 20 * log10(V / V0)

したがって、振幅を 20 dB 増やすには、ピーク値を 10 倍にする必要があり、逆に -20 dB は振幅を 10 分の 1 に減らすことになります。

于 2012-04-04T15:30:49.693 に答える