1

次の方法を使用して正弦波を生成しています-

sampling rate = 22050;
theta = 0;

for (i = 0; i < N; i++)  
{  
 theta = phase * 2 * PI;  
 signal[i] = amplitude * sin(theta);  
 phase = phase + frequency/sampling rate;  
}

周波数が 8000 Hz の信号を生成すると、出力に歪みが生じます。これより低い周波数 (たとえば 6000 Hz) は正しく生成されます。このように位相にチェックを入れると、8000 Hz の信号が正しく生成されます。

if (phase > 1)  
{  
  float temp = phase - 1;  
  phase = temp;  
}  

Xcodeの正弦関数と関係があると思いますが、おそらく許容できる値の範囲ですか? 位相ラッピングの有無にかかわらず同じコードは、Matlab では違いがありません。誰かがここで何が起こっているのか説明できますか?

4

3 に答える 3

1

計算は (2.0 * PI) * 周波数/サンプルレートである必要があると思います

これにより、ラジアンで次の位相増分が得られます。この値を Sin 関数に入力して、位相を計算できます。ラジアン値を累積する必要があることに注意してください。

技術的には、最初のステートメントは言葉遣いが間違っています。FS/2 はナイキスト値です。これを超える周波数を生成することはできますが、エイリアシングが発生します。

フェーズ ラッピングに関しては、これを管理するさまざまな方法があります。

ラジアンについての私の理解は、位相が 2 pi 値の周りを回転する間、繰り返されない位相の「線形」表現であるということです。したがって、ラジアンを管理して位相を管理すれば、ラップの問題は発生しない可能性があります。

より知識のある人々によって修正されることを嬉しく思います。

于 2016-03-16T20:05:24.017 に答える
0

確かではありませんが、次のような問題があると思います。

theta = phase * 2 * PI;  

Xcode は結果を整数に変更すると思います。あなたは試してみたいかもしれません:

theta = phase * 2.0 * PI;  

代わりに、PI変数がdouble.

これらすべてが、これを DSP.SE のトピック外にしています。:-)

于 2016-03-23T12:59:54.830 に答える