明後日からリフォーム復活です.こんばんわ.ひらりんです.
FB706の固定小数点演算でsin波を出してみよう.こんな感じです.ノコギリ波のイジイジしたリンギングはDACのfilterのせいです.
math_bf.hにsin_fr32(x)という関数が定義されています.これを使ってsin波を出します.
sin_fr32(x)は32bit固定小数点入出力の関数です.
この関数の定義域と値域はどうなってるのかをまず調べました.
↓こうなりました.すなわち、
定義域 x = ーπ/2 ~ +π/2
まず値域については、、、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詰め合わせはこちらです.
かしこ
> boolの論理反転って~pか!pで出来ないのかね? > Cさん
返信削除boolがC99の_boolを使うように定義されていれば、
p->polarity = !(p->polarity);
でできると思いますよ。
そうですよねぇ、できますよねぇ・・・・
削除なんでか期待通りにならんので微妙なことやってて、はずかしいわ~
裏でうごいてるgccみたいなのの仕様を調べてみます.C99かなんなのか.
読者 C99=>次回は、C103
返信削除いやそのCではない
うま~い
削除座布団3枚進呈
読者 うまい棒も好きです ベビースターラーメンも好きです
返信削除わたしはチキンラーメンを食べた経験が1度しかありません.
削除その1度での感想は「このまま喰ったらベビースター」でした.
またこんど喰ってみようかなぁ.ポリポリと.
読者 外国製のラーメンで麺は、ベビースターラーメンかあり、スープ辛いから麺だけ食べるとよい、と食べた。ハラルフードもある外国人の店。味は、ベビースターラーメン
返信削除結局みんなベビースター.
削除「みそきん」を食べたら、まぁ美味いけど絶品とか言うほどとは言えない感想でした.
読者 みそきんは、そんなですか。イースターは、しょう油か、みそか、塩焼き
返信削除みそきん販売第2段では買えました。らっきぃ
削除