Как правильно FFT звуковой массив?

Я пытаюсь получить список частот, присутствующих во входном аудиосэмпле. Кажется, мне нужно сделать FFT, чтобы получить этот результат, но я получаю странные ответы, когда я его FFT (используя FFTW): я получаю массивы, содержащие в основном нули с несколькими невероятно большими элементами (300+ цифр!) - и эти большие числа всегда в одном и том же месте (5 мест с конца, 46 мест с конца и несколько других, которые появляются спорадически), независимо от того, меняю ли я частоту входного тона или даже если я изменяю длину семпла для БПФ. Что я делаю неправильно? Вот мой код:

#include <fftw3.h>
#include <sndfile.h>
#include <math.h>
#include <algorithm>    

int main (int argc, char * argv []) {
    char        *infilename ;
    SNDFILE     *infile = NULL ;
    FILE        *outfile = NULL ;
    SF_INFO     sfinfo ;

    infile = sf_open("test.wav", SFM_READ, &sfinfo);

    int N = pow(2, 10);
    double samples[N];

    sf_read_double(infile, samples, 1);

    fftw_complex out[N];
    fftw_plan p;
    p = fftw_plan_dft_r2c_1d(N, samples, out, FFTW_ESTIMATE);

    fftw_execute(p);
    fftw_destroy_plan(p); 

    for (int i=0; i<N; i++) {
        printf("%f %f\n", out[i][0], out[i][1]);
    }

    sf_close (infile) ;

    return 0 ;
}

1 ответ

Решение

Проблема была двоякая: во-первых, я не загружал все звуковые данные, а во-вторых, я просто принимал реальную составляющую результата. Кроме того, я все еще получал непригодную часть БПФ (выше частоты Найквиста). изменения sf_read_double(infile, samples, 1) в sf_read_double(infile, samples, N)меняется for (int i=0; i<N; i++) { в for (int i=0; i<N/2; i++) { и меняется

printf("%f %f\n", out[i][0], out[i][1]);

в

printf("%i %f\n", i*21, sqrt(out[i][0]*out[i][0] + out[i][1]*out[i][1]));

дал мне хорошие результаты, которые я хотел.

Другие вопросы по тегам