[英]kissfft - Inverse Real FFT gives NaN
真正的逆FFT給了我一個充滿NaN而不是浮點數的數組。
kiss_fftri(conf,complex_array,output);
complex_array是正常的,我猜的值沒有問題。
kiss_fftr_cfg conf = kiss_fftr_alloc(size,1,NULL,NULL);
就我所知, conf應該也可以。
大小有問題嗎? 我知道前向 FFT的輸出大小必須為N / 2 +1 ,而上面的大小應為N。
我已經通過頻域和所有方面的音頻卷積制作了一個簡單的工作示例, 但是我不知道 這里 發生 了 什么 。
NaN和上面的complex_array的一些示例。
在我的示例中, size參數始終為18750 。 多數民眾贊成在樣本數量。 因此,N / 2 + 1是7876 。
首先,我有一個帶有450k樣本的單聲道。 然后將其分為24個部分。 現在每個部分都是18750個樣本。 對於每個樣本,我都在用脈沖響應進行卷積。 所以基本上我在上面打印的數字可以說是for循環進行的每24回合中的前20個樣本。 我猜這里沒錯。
我什至對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..
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.