Не могу применить БПФ к простой волне косинуса

Я уже прочитал немало постов о дискретном преобразовании Фурье, но я испытываю трудности с его применением на простой косинусной волне. Я использую библиотеку kiss_fft для вычисления DFT набора данных и библиотеку растровых изображений для визуализации результата.

Вот код C ++:

#define FIXED_POINT 32
#include "kiss_fft.h"
int main()
{
const int width = 512;
const int height = 512;
const int align_center = 256;
const int fft_siz = width;
const int is_inverse = 0;

Bitmap bmp_t("fft_time.bmp", width, height);
Bitmap bmp_f("fft_frq.bmp", width, height);

kiss_fft_cpx* in = (kiss_fft_cpx*)malloc(sizeof(kiss_fft_cpx) * fft_siz);
kiss_fft_cpx* out= (kiss_fft_cpx*)malloc(sizeof(kiss_fft_cpx) * fft_siz);
kiss_fft_cfg cfg = kiss_fft_alloc(fft_siz, is_inverse, NULL, NULL);

// initialize input data
for(int i = 0; i < fft_siz; i++)
{
// I think I shouldn't add align_center to in[i].r
// but should wait till line (1*)
in[i].r = align_center + 128 * cos(0.128f * i);
in[i].i = 0;

// line (1*)
bmp_t.setPixel(i, in[i].r, 255, 255, 255);
}

kiss_fft(cfg, in, out);

// visualize output
for(int i = 1; i < fft_siz; i ++)
bmp_f.setPixel(out[i].r, out[i].i, 255, 255, 255);

free(in);
free(out);
free(cfg);

kiss_fft_cleanup();

bmp_t.write();
bmp_f.write();

return 0;
}

Вот вход:

введите описание изображения здесь

и что я получаю в качестве вывода:

введите описание изображения здесь

Результат не совсем подходит. Что это я делаю не так?

1

Решение

Построение только реального компонента вывода БПФ не очень значимо — вместо этого нанесите величину (sqrt(re*re+im*im)). Еще лучше выведите величину логарифма в дБ (10*log10(re*re+im*im))

3

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector