簡體   English   中英

kissfft-逆實數FFT給出NaN

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM