1

マイクロコントローラー シンセに取り組んでいますが、ボリューム エンベロープの生成で問題が発生しました。私は現時点でこのコードを持っています:
to_dac =(SinTable[lut_pos] * (volume))>>8;

正常に動作しますが、解像度が非常に悪く、十分に高速に実行できるように改善する方法がわかりません (これはすべてのサンプルで実行する必要があるため)。

これらは私が今得ている結果です:

波形

これが現在の MP3 のサウンドです: (注: DAC はブレッドボード上にあり、出力にローパス フィルターがないため、余分なノイズが発生します)

私はMSP430デバイスを使用しています(現時点ではMSP430G2553ですが、本当に必要な場合はMSP430F5510を使用できます(より多くのメモリ、より高速な速度)例を探してみましたが、それらはすべて浮動小数点変数sin()を使用しています) ; math.h の関数などですが、私にはそれらの贅沢はありません...

編集:私は完全なばかで、別のコードで振幅エンベロープの解像度を低くしましたが、振幅変調の他のソリューションを受け入れています。

4

2 に答える 2

0

コードの残りの部分とハードウェアのセットアップの一部を確認する必要がありますが、ミッドレールの仮想グラウンドがあると思いますか?その場合、SinTable []は基準グラウンドを参照します(つまり、12ビットdacの場合、仮想グラウンド出力は2048、Vccは4095、Gndは0になり、ボリュームを掛けると仮想グラウンドがシフトします接地。

これを試して..

if (SinTable[lut_pos] >= 2048) {
  out = 2048 + (SinTable[lut_pos]-2048)*volume;
} else {
  out = 2048 - (2048-SinTable[lut_pos])*volume;
}
to_dac = out>>8;

なぜビットシフトするのかはわかりませんが、事前にSinTableをスケーリングすることで、問題を回避できます。

于 2012-11-09T11:01:51.760 に答える
0

MSP430G2553 のデータシートを確認しましたが、DAC が見つかりません。外部DACを使用していますか?

最新の MCU には、DMA をサポートする高速 DAC があります。データを ADC に送信するコマンドを DMA に与えるよりも、メモリ内のテーブル (1 つまたは複数の sin 周期) を埋めることができます。

したがって、CPU に他の仕事をするためのより多くの空き時間を与えることができます。

于 2014-07-20T16:27:18.703 に答える