2023年8月16日水曜日

BlackFinを使ってみるなり(17) 固定小数点のsin_fr32()でsin波を出す

明後日からリフォーム復活です.こんばんわ.ひらりんです.

FB706の固定小数点演算でsin波を出してみよう.こんな感じです.ノコギリ波のイジイジしたリンギングはDACのfilterのせいです.

math_bf.hにsin_fr32(x)という関数が定義されています.これを使ってsin波を出します.

sin_fr32(x)は32bit固定小数点入出力の関数です.
この関数の定義域と値域はどうなってるのかをまず調べました.
↓こうなりました.すなわち、
 定義域  x = ーπ/2 ~ +π/2
 値域   sin_fr32(x) = -1 ~ +1
まず値域については、、、32bit符号付整数の表現範囲のmaxが 0x7FFFFFFF で、これが+0.999999に相当します.グラフが2E+09まで振れているのは、0x7FFFFFFF = 2147483647 ≒ 2E+9だからです.表現範囲のマイナス方向minは0x80000000で、これが-0.999999に相当します.
つぎに定義域は、x=0.99999を+π/2に相当させているようです.マイナス方向も同様.

sin_fr32は周期関数でなくて、ブツ切りsin関数ですから、使い方には注意が必要です.
X=0から少しずつXを増やしてsin波を発生させるのは通常どおりですが、X=0x7FFFFFFFに達した次はX=0x80000000に飛んでしまうので、そこから先は(-1)*sin_fr32(z)に極性を変える必要があります.
こういう極性反転をπラジアン毎に繰り返す必要があります.

ーーーー
このような初期化関数で、サンプリング周波数、周波数、レベル、DC、波形を設定します.レベルとDCは未実装です.いずれは位相も調整できるようにしなくちゃいけない.
 h_wavegen_init(
  H_WAVEGEN_RCH,
  192000,   // sample freq.   ex.96000 Hz
  10000,    // signal freq.
  0,        // level
  0,        // dc
  H_WAVEGEN_SIN
 );

ーーーー
I2Sのバッファ空っぽ割り込みで、バッファに波形データを仕込みます.
 L = h_wavegen(H_WAVEGEN_LCH); ←この中でsin_fr32()を呼ぶ
 nBufferTx0[i+0] = L;  ←リトルエンディアン
 nBufferTx0[i+1] = L>>8;
 nBufferTx0[i+2] = L>>16;
 nBufferTx0[i+3] = L>>24;

ーーーー
sin_fr32(x)のxの更新stepの計算式.
 step_sin = 0x100000000 * 2 / ( fsmpl / freq ) ;

たとえば96kHzサンプルで1000Hzを発生させるには、
 step_sin = 0x100000000 * 2 / ( 96000/ 1000 ) = 8947848
となります.

ーーーー
sin_fr32(x)の極性反転について.
xが正→負に変わった瞬間で極性反転させています.
 xold = x;
 x += step;
 if( xold>=0 && x<0 ) {
  p->polarity = p->polarity==true ? false : true;
 }
boolの論理反転って~pか!pで出来ないのかね? > Cさん

ーーーー
project詰め合わせはこちらです.

16へ    18へ

かしこ

10 件のコメント:

  1. > boolの論理反転って~pか!pで出来ないのかね? > Cさん
    boolがC99の_boolを使うように定義されていれば、
    p->polarity = !(p->polarity);
    でできると思いますよ。

    返信削除
    返信
    1. そうですよねぇ、できますよねぇ・・・・
      なんでか期待通りにならんので微妙なことやってて、はずかしいわ~

      裏でうごいてるgccみたいなのの仕様を調べてみます.C99かなんなのか.

      削除
  2. 読者 C99=>次回は、C103
    いやそのCではない

    返信削除
  3. 読者 うまい棒も好きです ベビースターラーメンも好きです

    返信削除
    返信
    1. わたしはチキンラーメンを食べた経験が1度しかありません.
      その1度での感想は「このまま喰ったらベビースター」でした.
      またこんど喰ってみようかなぁ.ポリポリと.

      削除
  4. 読者 外国製のラーメンで麺は、ベビースターラーメンかあり、スープ辛いから麺だけ食べるとよい、と食べた。ハラルフードもある外国人の店。味は、ベビースターラーメン

    返信削除
    返信
    1. 結局みんなベビースター.

      「みそきん」を食べたら、まぁ美味いけど絶品とか言うほどとは言えない感想でした.

      削除
  5. 読者 みそきんは、そんなですか。イースターは、しょう油か、みそか、塩焼き

    返信削除
    返信
    1. みそきん販売第2段では買えました。らっきぃ

      削除