2015-05-09 4 views
0

Реальный обратный FFT дает мне массив, полный NaN s вместо поплавки.kissfft - Inverse Real FFT дает NaN

kiss_fftri(conf,complex_array,output); 

complex_array нормально, ничего плохого с ценностями я предполагаю.

kiss_fftr_cfg conf = kiss_fftr_alloc(size,1,NULL,NULL); 

конф должно быть тоже хорошо, насколько я знаю.

Что-то не так с размером? Я знаю, что выходной размер вперед FFT должен быть N/2 + 1 и размер выше должен быть N.

Я уже сделал простой рабочий пример с аудио свертки в частотной области и все, , но я понятия не имею, Что происходит здесь.


enter image description here enter image description here

Nans и некоторые образцы, complex_array выше.

размер параметр в моем примере всегда . Это количество образцов. Таким образом, N/2 + 1 .

Сначала у меня есть моно канал с образцами 450 тысяч. Затем я разбиваю его на 24 части. Каждая часть теперь составляет 18750 образцов. С каждым из этих образцов я делаю свертку с импульсным откликом. Таким образом, в основном числа, которые я печатаю выше, позволяют сказать, что первые 20 образцов в каждом из 24 раундов цикл for. Думаю, здесь ничего плохого.

Я даже сделал on kiss_fftr_next_fast_size_real (размер), и он остается таким же, чтобы размер был оптимальным.


Вот мой свертка:

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; 
} 

размер I вход здесь через аргумент является N/2 + 1.

+1

Угадай, что вам нужно показать немного больше своего кода, чтобы оно было полезным. Вы инициализировали выходной массив, который вы передаете функции fftri? – BitTickler

+0

@BitTickler Yup. 'kiss_fft_scalar output [size];' 'memset (output, 0, size * sizeof (kiss_fft_scalar));' – Rok

+0

Здесь 'complex_array' является результатом свертки некоторых звуковых данных и импульсного отклика. Кажется, все хорошо, как я уже говорил. – Rok

ответ

2

Это не поцелуй, который вызывает здесь проблему. Именно так обрабатывается массив результатов (mis).

Чтобы действительно «держать его простым и глупым» (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.. 
} 
+0

Спасибо, миллион! <3 – Rok

 Смежные вопросы

  • Нет связанных вопросов^_^