2

最初にAM、後でFMなどを調整するSDRシステムをまとめたいと思います。これを行うために使用する予定のシステムには、ダイレクトデジタルシンセシス(DDS)のサインルックアップテーブルがあります。適切に調整するには、ミキサー(この場合は乗数)に供給される正弦波の周波数を正確に制御できる必要があります。線形補間は近いと思いますが、非線形法の方が良い結果が得られると思います。

サインテーブルに使用するための優れた高速補間方法は何ですか。ターゲットシステムでは、乗算と加算は安価です。分割にはコストがかかります。

編集:定数をスケーリングされた整数に正規化するために、乗算/シフト関数を使用して定数を実装することを計画しています。中間値はワイド加算を使用し、乗算は18ビットまたは17ビットを使用します。浮動小数点「事前計算」は使用できますが、ターゲットプラットフォームでは使用できません。「分割にはコストがかかる」とは、乗数と多くのコードを使用して実装する必要があることを意味します。それは考えられないことではありませんが、避けるべきです。ただし、真の浮動小数点IEEEメソッドは、カスタム実装だけでなく、このプラットフォームでもかなりの量のリソースを必要とします。

SDRの経験があれば役に立ちます。

4

6 に答える 6

8

線形補間であまり良い結果が得られない場合は、三角関数の関係を試すことができます。

和と差の式

sin(A+B)=sinA*cosB + cosA*sinB
sin(A-B)=sinA*cosB - cosA*sinB
cos(A+B)=cosA*cosB - sinA*sinB
cos(A-B)=cosA*cosB + sinA*sinB

また、A、B範囲のsinおよびcos値を事前に計算することができます。

A range: 0, 10, 20, ... 90
B range: 0.01 ... 0.99
于 2009-07-22T11:30:01.737 に答える
4

なぜテーブルなのか?この非常に高速な関数は、信号が-20dbのときに、-90dbに最悪のノイズピークがあります。それはクレイジーです。

オーディオのリサンプリングには、Elephant紙の補間器の1つを常に使用します。これは、前のSOの質問で説明されています。

fpを備えていないプロセッサを使用している場合でも、これらのことを実行できますが、より困難です。そこに行ったことがある。あなたの痛みが分かります。幸運を!以前は楽しみのためにfpからintegerに変換していましたが、今はそれを行うために私にお金を払わなければなりません。:-)


あなたの問題に当てはまるクールなオンラインリファレンス:

http://www.audiomulch.com/~rossb/code/sinusoids/

http://www.dattalo.com/technical/theory/sinewave.html


編集:あなたのコメントに基づく追加の考え

トリッキーなプロセッサで作業しているので、サインテーブルをより多くの角度で検索できるようにする方法を検討する必要がありますが、それでも小さくしてください。

象限を90個に分割するとします(実際には、おそらく256個を使用しますが、親しみやすさと明確さのために90個のままにしておきましょう)。それらを16ビットとしてエンコードします。これまでのところ、これは180バイトのテーブルです。

さて、これらの学位のすべてについて、9つ(実際にはおそらく8つまたは16つ)の中間点があります。

例として、3度から4度の間の範囲を取り上げましょう。

sin(3)=0.052335956 //this will be in your table as a 16-bit number
sin(4)=0.069756474 //this will be in your table as a 16-bit number

だから私たちはsin(3.1)を見ていきます

sin(3.1)=0.054978813 //we're going to be tricky and store the result
                     // in 8 bits as a percentage of the distance between
                     // sin(3) and sin(4)

あなたがしたいのは、sin(3.1)がsin(3)とsin(4)の間にどのように収まるかを理解することです。中間の場合は、128バイトとしてコーディングします。中間の場合は、64としてコーディングします。

これは追加の90バイトであり、わずか180 + 90*9バイトで16ビット解像度で10分の1度までエンコードしました。必要に応じて拡張し(おそらく32ビットの角度と16ビットのトゥイーン角度まで)、その間を非常にすばやく線形補間することができます。ストレージスペースを最小限に抑えるために、連続する値が互いに近いという事実を利用しています。


編集2:テーブル内の中間の角度をエンコードするためのより良い方法

これを行ったとき、線形補間による期待値と実際の値のを非常にコンパクトに表現することになったのを思い出しました。このエラーは常に同じ方向にあります。

最初に範囲内の最大誤差を計算し、次にそれに基づいてスケールを計算しました。

うまくいきました。説明のためにブログエントリのコードを実行する必要があるように感じます。:-)

于 2009-07-24T17:21:10.850 に答える
4

滑らかな関数のテーブル補間= ick hurl bleah。IMHOテーブル補間は、本当に奇妙な関数、または不連続を避けるために絶対に必要な場合にのみ使用します(ただし、補間されたテーブルの導関数は不連続であることに注意してください)。テーブル ルックアップと必要な補間コードを実行し終える頃には、多項式を 1 つまたは 2 つ評価している可能性があります。

私見では、正弦波形の各セグメント (たとえば、-90 ~ +90 度、または -45 ~ +45 度、次に同じ幅の他のセグメント) にチェビシェフ近似を使用し、最小次数多項式を選択する方がはるかに優れています。これにより、エラーが望ましい値に減少します。セグメントが十分に小さい場合は、二次多項式または線形多項式でさえもうまくいく可能性があります。精度、セグメント数、および多項式の次数の間にはトレードオフがあります。

この他の質問の私の投稿を参照してください。係数を計算する手間が省けます(少なくとも私の数学を信じるなら)。

(編集:これが明確でない場合は、設計時にお気に入りの高性能PCでチェビシェフ近似を実行して、実行時にダートバッグマイクロコントローラまたはFPGAなどを次数の単純な多項式で使用できるようにします1-4. 自分が何をしているのかわからない限り、4 度を超えないでください。3 以下が望ましいでしょう。)

于 2009-07-23T15:49:21.237 に答える
3

サインテーブルでの補間は、効果的にリサンプリングされます。明らかに、への1回の呼び出しで完璧な結果を得ることができるsinので、ソリューションが何であれ、それを上回る必要があります。固定フィルターのリサンプリングの場合でも、使用可能なポイントの固定セットのみがあります(3:1アップサンプラーは、テーブルの各ポイント間に2つの新しいポイントが使用できることを意味します)。ターゲットシステムのメモリはどれくらい高価ですか?私の主な推奨事項は、単にテーブルの解像度を改善し、線形補間を使用することです。小さいテーブルと単純なアップサンプルと同じ結果が得られますが、計算のオーバーヘッドは少なくなります。

于 2009-07-22T11:01:53.917 に答える
1

三角関数にテイラー級数を使用することを検討しましたか (ここにあります)? これには乗算と除算が含まれますが、数値の表現方法によっては、除算を乗算 (または運が良ければビット シフト) に変換できる場合があります。級数の項を必要な数だけ計算して、その方法で精度を得ることができます。

あるいは、この正弦波がある時点でアナログ信号になる場合は、ルックアップ テーブル アプローチを使用し、アナログ フィルターを使用して、結果の波形からサンプリング周波数を削除することができます。サンプリング周波数が正弦周波数の 100 倍の場合、簡単に削除できます。これを行うには、可変フィルターが必要です。私はそのようなことをしたことはありませんが、2進数を取り、抵抗を変更するデジタルポテンショメーターがあることは知っています. それは可変RCフィルターの基礎になる可能性があります-おそらくゲイン用のオペアンプなどを使用します.

幸運を!

于 2009-07-24T17:16:55.647 に答える
0

ハードウェアの乗算命令、ましてや除算命令すらも持たないメモリ量の少ないシステムで、sin() をすばやく計算するための驚くほど巧妙なコードがいくつか書かれています。

複雑さが増す順に:

  • 方形波を使用します。多くの AM ラジオは、リング復調器で方形波を使用していますが、AM 復調器にもっと複雑なものが必要な理由がわかりません。

  • 四半期サイクルごとに 256 の値の生のテーブルで「最も近い値」を検索して、sin() を概算します。はい、おぞましい階段が見えますが、(少しアナログ フィルタリングを使用すると) これはしばしばうまく機能します。(実際、これはやり過ぎであることが多く、もっと短いテーブルで十分です)。

  • 生のテーブルで最も近い 2 つの値を検索し、それらの間を線形補間することで、sin() を概算します。

  • 1/4 サイクルごとに 16 個の短い等間隔の x キュービック スプラインを使用して sin() を近似すると、sin(x) の「16 ビットよりも優れた精度が得られます」。

Wikibooks: Fixed-Point Numbersは、最後の 3 つの巧妙な実装へのリンクです。

于 2013-05-01T19:04:52.347 に答える