Народ, не глянете, что я не так программирую в быстром преобразовании Фурье? Я пишу программный фильтр и пока занимаюсь отсеиванием наводки в 50 герц. Обычное вычисление дискретного преобразования Фурье дает красивую синусоиду, отлично вписывающуюся в сигнал, а вот БПФ дает какую-то прыгающую синусоиду, которая пляшет и по фазе и по амплитуде. В чем может быть дело?
Я использую рекусрсивный алгоритм БПФ с прореживанием по частоте, с 1024 точками. Эти 1024 точки промеряют сигнал таким образом, что на них попадает два полных колебания 50-герцовой наводки.
Я не совсем в нем разобрался, поэтому, где-то наверное ошибся. Помогите найти, вроде не должно быть сложно, кто разбирался!
Комплексной библиотекой я не пользуюсь, поэтому работаю отдельно с косинусоидальными и синусоидальными частями. Сначала я иницализирую таблицу ортогональных функций (синусов и косинусов), длинной в половину, то есть в 512 занчений:
void dif( int Length, int EvenStart, int UnitIndexStep ) {
// делим полученную длину пополам
int SubLength = Length / 2;
// получаем сдвиг индекса для второй половины
int OddStart = EvenStart + SubLength;
// если рекурсия дошла до длины в одну точку — прекращам
if( Length > 1 ) {
// пробегаем половину массива, а остальную половину берем при помощи сдвига
// для пользования единой таблицей ортогональных функций используем шаг u
for( i=0, u=0; i<SubLength; ++i, u+=UnitIndexStep ) {
// первое крыло "бабочки" — комплексная сумма значений из двух половин
EvenCosine = ValueCosine[EvenStart+i] + ValueCosine[OddStart+i];
EvenSine = ValueSine[EvenStart+i] + ValueSine[OddStart+i];
// второе крыло "бабочки" — комплексная разность значений из двух половин
OddPreCosine = ValueCosine[EvenStart+i] — ValueCosine[OddStart+i];
OddPreSine = ValueSine[EvenStart+i] — ValueSine[OddStart+i];
Понимаю, что где-то наверное не учел нормировку, но все равно непонятно, почему гармоника получается прыгающей. Пытался подобрать в последней части знаки плюс/минус, функции синусы/косинусы и т.п., но картина качественно не меняется, наверное ошибка в рекурсии или в расчете ортогональных функций.