Понимание результатов netlib fftpack - PullRequest
1 голос
/ 09 марта 2020

Мне нужно реализовать кроссплатформенный STFT на C ++, который можно вызывать как из python, так и для компиляции для запуска на iOS / Android. Я решил использовать fftpack , поскольку он легкий и, кажется, делает FFT довольно быстро.

Я написал тестовый код в C:

int n = 8;
float wsave[2*n + 15];
int ifac[n+15];

float arr[8] = {11.0, 3.0, 4.05, 9.0, 10.3, 8.0, 4.934, 5.11};


// initialize  rfftf and rfftb
__ogg_fdrffti(n, wsave, ifac);

// forward transform of a real periodic sequence
__ogg_fdrfftf(n, arr, wsave, ifac);


// Print result
std::cout << "[";
for(int k=0; k<n-1; k++){
    std::cout<<arr[k] << ", ";
}
std::cout << arr[n-1] << "]" << std::endl;

// Result: [55.394, -5.58618, 1.66889, 12.316, 3.11, 6.98618, -0.0991108, 5.174]

Чтобы попробовать мой код, я запустил scipy rfft в том же массиве:

arr = np.array([11.0, 3.0, 4.05, 9.0, 10.3, 8.0, 4.934, 5.11])
res = np.real(rfft(arr, n=8))
print(res) # Prints [55.394      -5.58617928 12.316       6.98617928  5.174     ]

Почему у Сципи меньше ценностей. Похоже, что Сципи пропускает некоторые значения из одного и того же массива результатов, но почему? Как прочитать правильные значения FFT из arr в C ++?

1 Ответ

2 голосов
/ 09 марта 2020

Вы получаете те же значения из вашей программы на C ++, что и в вашем python скрипте. Просто вы отбрасываете воображаемые части в сценарии python:

#!/usr/bin/python3

from scipy.fftpack import rfft

arr = [11.0, 3.0, 4.05, 9.0, 10.3, 8.0, 4.934, 5.11]
res = rfft(arr, n=8)
print(res)

Вывод

[55.394      -5.58617928  1.66888853 12.316       3.11        6.98617928
 -0.09911147  5.174     ]
...