« ビットリバースのバグ? | トップページ | 回路マンガ「おれデバ」第3話を更新 »

2016.07.07

Radix-4とRadix-8 FFTのビットリバース

FFTの結果が正しくならない原因がわかりました。

Radix-4とRadix-8 FFTのビットリバースは、Radix-2のものとは違うのです。

普通のFFT、つまりRadix-2のFFTでのビットリバースは誰でも知っているとおりこうでした。

Bitrev2

つまり、B'00000000、B'00000001、B'00000010・・がB'00000000、B'10000000、B'01000000になるというわけです。

FFTの基本のキです。

Radix-4になると、ビットリバースはこうなります。

Bitrev4_2

驚きの交換法則。

つまり、

00000000→00000000
00000001→01000000
00000010→10000000
00000011→11000000
00000100→00010000
00000101→01010000
・・・
11111101→01111111
11111110→10111111
11111111→11111111

となります。Radix-2では2ビットずつリバースするわけですね。

だから、Radix-8では3ビットずつリバースします。今作っている32768ポイントのFFTであれば、こうなります。

Bitrev8

0x0000→0x0000 B'000000000000000
0x0001→0x1000 B'001000000000000
0x0002→0x2000 B'010000000000000
0x0003→0x3000 B'011000000000000
0x0004→0x4000 B'100000000000000
0x0005→0x5000 B'101000000000000
0x0006→0x6000 B'110000000000000
0x0007→0x7000 B'111000000000000
0x0008→0x0200 B'000001000000000
0x0009→0x1200 B'001001000000000
0x000a→0x2200 B'010001000000000
0x000b→0x3200 B'011001000000000
0x000c→0x4200 B'100001000000000
0x000d→0x5200 B'101001000000000
0x000e→0x6200 B'110001000000000
0x000f→0x7200 B'111001000000000
0x0010→0x0400 B'000010000000000
0x0011→0x1400 B'001010000000000
0x0012→0x2400 B'010010000000000
0x0013→0x3400 B'011010000000000
・・・

と変化します。

昨日のスペクトラムが二進数的に変な具合だった原因もわかりました。

これでFFTの結果を見てみます。

まずは3MHzの正弦波を入れたとき。ちゃんと1本のスペクトラムが立ちました。

Fft_1

ADCが12bitなのに計算が16bitだったので、16倍してみましたところ、にぎやかなスペクトラムになって、高調波がいっぱいでました。

Fft_2

どうやらADCの結果は符号なし二進数だったのに、FFTの計算は符号付二進数なので、歪になってしまったのでしょう。しかし、スペクトラムはすべて等間隔にでているのでFFTの計算自体はあっていそうです。

あとすこし。


|

« ビットリバースのバグ? | トップページ | 回路マンガ「おれデバ」第3話を更新 »

コメント

コメントを書く



(ウェブ上には掲載しません)




« ビットリバースのバグ? | トップページ | 回路マンガ「おれデバ」第3話を更新 »