2012-11-26 5 views
5

ASMを使用したAtmel AVRでDDSプロジェクトを完了しましたが、8ビットのルックアップテーブルと8ビットDACが多すぎる量子化を作成するという結論に達しました低周波での歪み。より良い言葉遣いの欠如のために、私はオシロスコープにはしご効果を持つ正弦波を得ています。DDS補間 - 8ビットAtmel AVR ASMから12ビットDAC

明らかに、大きなLPFで波形を平滑化すると、より高い周波数で振幅に問題があります。

理論的には、8ビットDACから12ビットDACにアップグレードし、4つの最下位ビットで補間を使用すると、高い周波数での波形振幅の問題を緩和するのに十分な大きさのフィルタのカットオフポイントを上げることができます。私の問題は、私はこれを行う方法の手がかりを持っていないか、ジッパー効果..おそらく12ビットのルックアップテーブルを削除する簡単な方法がある場合ですか?

これまでは無限ループを作成しました。ループがサイクルを完了するたびに、ルックアップテーブルに関連するポインタの位置に基づいて値がDACに送信されます。ここで私は混乱します。私はこれに関する情報のトンを読んだが、まだ実用的な例が見つかりませんでした。無限ループがある場合、補間値をテーブルルックアップ値の間に埋め込む方法を教えてください。私が考えることができる最も良いことは、(a + b)/ 2です。おそらくこれを実装して512ビットのルックアップテーブルに余分なビットを付け加えることができますが、より良い結果をもたらす可能性のある簡単な方法があると思います。私はCやそれを採用する方法を知らないが、それが賢明であれば試してみる。

現在、私の時計は1MHZです。必要に応じて、おそらく16MHZに行くことができます。ここで

は、私のコードのサンプルです:

。正弦波出力をデフォルトとして設定する

ldi  ZH, High(sine*2); setup Z pointer hi 
    ldi  ZL, Low(sine*2) ; setup Z pointer lo 

;クリアアキュムレータ

clr  r29    ; clear accumulator 

;セットアップ加算器は、登録

ldi  r24,0x50  ; Fine adder value change register 
    ldi  r25,0x08  ; Middle adder value change register 
    ldi  r26,0x00  ; Coarse adder value change register 

LOOP1:

add  r28,r24   ; 1 Adder values carry over to higher registers. Higher registers raise freq. in larger steps 
    adc  r29,r25   ; 1 
    adc  r30,r26   ; 1 r30 is database address pointer for Z register 
    lpm  r0, Z   ; 3 (Load Program Memory) Reads byte from database into the destination register based on Z pointer 
    out  PORTD,r0 


    rjmp LOOP1   ; 2 => 9 cycles 

答えて

2

あなたのLUTは、256個のエントリを持っている場合、あなたは、最初の2つの連続したサンプル間のスケーリング係数として(明らかに0から255まで行く)レジスタR29を使用することができます。

Output = (LUT[r30] * (256 - r29) + LUT[r30+1] * r29) >> 8;

Also this thread正弦波発生の多くの実用的な代替案を説明します。

EDITトン= 1のときtは、0およびy = bは=とき、Yは、=ようにするための式は、テキストブック線形補間

y = a*(1-t) + b*t, with 0<=t<1 

を実現します。 8をシフトすることは、補間項tが乗算後に256で除算されることを意味する。式LUT [r30 + 1]では、r30が8ビットであるため、暗黙のモジュロ256の算術を仮定しています(そうではありませんか?)。

12ビットへのLUT拡張は、代わりに4で除算すると、LUTの量子化誤差が増加するだけなので、別々に行う必要があります。

enter image description here

補間は、多くのサンプルが同じ範囲、例えばに落ちる場合にかかわらず、LUTに常に整数インデックスに対して起こります。 LUT 2およびLUT [3]。人間の聴覚系は絶対参照位相を持たないため、数学的にはLUT [R]、LUT [R + 1]は[R-1]、[R]よりも正しいが、実際には違いはない。

+0

ありがとうございます。私はそれを理解していない。なぜ右に8ビットシフトするのですか?方程式の最初の部分は非常に簡単にレジスタをオーバーフローさせる可能性があります。 LUT [r30 + 1]は波形の位相を変更するのではなく、ポインタの次の時間に敏感なステップに進むのではないでしょうか?以前のポインタステップを照会する方が理にかなっていませんか? –

関連する問題