Реальное обратное БПФ дает мне массив, полный NaNс вместо поплавки.
kiss_fftri(conf,complex_array,output);
complex_array это нормально, ничего плохого в значениях, я думаю.
kiss_fftr_cfg conf = kiss_fftr_alloc(size,1,NULL,NULL);
конф должно быть тоже хорошо, насколько я знаю.
Что-то не так с размером? Я знаю, что выходной размер вперед БПФ должен быть N / 2 + 1 и размер выше должен быть N.
Я уже сделал простой рабочий пример с аудио сверткой в
частотная область и все, но я понятия не имею, что происходит
Вот.
NaNs и некоторые образцы, complex_array выше.
размер Параметр в моем примере всегда 18750. Вот количество образцов. Поэтому N / 2 + 1 7876.
Сначала у меня моноканал с 450 тыс. Сэмплов. Затем я делю его на 24 части. Каждая часть теперь 18750 образцов. С каждым из этих образцов я делаю свертку с импульсным откликом. Итак, в основном числа, которые я печатаю выше, скажем, первые 20 сэмплов в каждом из 24 раундов цикла for. В этом нет ничего плохого.
Я даже сделал на kiss_fftr_next_fast_size_real (size), и он остался прежним, поэтому размер должен быть оптимальным.
Вот моя свертка:
kiss_fft_cpx convolution(kiss_fft_cpx *a, kiss_fft_cpx *b, int size)
{
kiss_fft_cpx r[size];
memset(r,0,size*sizeof(kiss_fft_cpx));
int skalar = size * 2; // for the normalisation
for (int i = 0; i < size; ++i){
r[i].r = ((a[i].r/skalar) * (b[i].r)/skalar) - ((a[i].i/skalar) * (b[i].i)/skalar);
r[i].i = ((a[i].r/skalar) * (b[i].i)/skalar) + ((a[i].i/skalar) * (b[i].r)/skalar);
}
return r;
}
размер Я здесь ввод через аргумент является N / 2 + 1.
Проблема не в поцелуе. Это как массив результатов (неправильно) обрабатывается.
Чтобы по-настоящему «оставаться простым и глупым» (KISS), я рекомендую использовать контейнеры STL для ваших данных вместо сырых массивов c ++. Таким образом, вы можете избежать ошибок, которые вы сделали в коде. А именно, возвращает массив, который вы создали в стеке.
kiss_fft_cpx convolution(kiss_fft_cpx *a, kiss_fft_cpx *b, int size)
… несет различные проблемы. Тип возвращаемого значения — это просто комплексное число, а не серия.
Я бы изменил сигнатуру функции на:
#include <vector>
typedef std::vector<kiss_fft_cpx> complex_vector;
void
convolution
( const kiss_fft_cpxy *a
, const kiss_Fft_cpx *b
, int size
, complex_vector& result
);
Затем в коде вы действительно можете изменить размер результирующего вектора до необходимого размера и использовать его точно так же, как массив с фиксированным размером, что касается ваших вычислений свертки.
{
result.resize(size);
// ... use as you did in your code: result[i] etc..
}