Я эспериментирую в CBuilder над FFT и окнами.
Нашёл реализуцию fixed-point FFT
http://www.jjj.de/fft/fix_fft.tar.gzГенерирую в Матлаб:
- сигнал (чистая синусоида частотой 53 гц - чтобы увидеть растекание спектра) длиной 1024;
- окно с плоской вершиной длиной 1024;
Все массивы в матлаб перевожу в int16 и копирую в CBuilder.
Делаю комплексное фурье(с использование подпрограммы на ссылке выше). Нахожу амплитуду (корень квадратный из суммы квадратов мнимой и действительной части поэлементно соответственно).
В итоге получаю через printf нечто вроде
0
0
0
16
1256
3256
1245
145
11
0
1
0
1
0
0
0
1
0
(все числа вымышлены и только для наглядности).
Когда суммирую числа из кучки выше (16+1256+3256+1245+145+11) и умножаю на 2 - получается в точности то, что и в матлаб!
Даже удивился точности!
Значит всё работает подумал я!
Да не тут то было.
Как только к сигналу примешиваю 5-ю гармонику с амплитудой 0.5 от основной, то сразу же спектр, выдаваемый целочисленным алгоритмом в CBuilder сильно искажаться по всем гармоникам, в итоге получаю кучу помех в спектре, причём там где спектр должен быть нулевым.
например
0
10
1
1
16
32
1114
123
0
1
0
1
10
32
556
124
11
0
1
0
1
15
123
112
144
114
10
1
1
Но в матлаб всё работает превосходно.
Итог: при использовании целочисленного алгоритма и окна с плоской вершиной нужно просуммировать "палки" в амплитудном спектре, относящиеся к искомым гармоникам.
При появлении гармоник кроме первой алгоритм даёт большую погрешность (хотя в матлаб всё работает нормально) .
Почему так может происходить?
Может дело в реализации FFT? Может кто поделится другой реализацией (только для int16). На плавучку очень не хочется переходить (код будет перенесйн на микроконтроллер без FPU)
Сообщение отредактировал Zelepuk - Aug 12 2011, 09:18