kissfft 使用過程中的一些坑總結

2021-10-13 22:32:47 字數 3919 閱讀 7090

kissfft有兩套api,

乙個是在kiss_fftr.h中

另乙個在kiss_fft.h中

basic api還是kiss_fft.h裡的,kiss_fftr.h是在kiss_fft.h的基礎上封裝了一層。

basic api只有fft沒有見到ifft??

利用頻域資料的共軛對稱性可以使用乙個介面完成fft和ifft,這裡的邏輯也即是kiss_fftr.h裡封裝的兩個介面

demo編碼資料型別都採用fixed_point, 即int16

下面的**是在原始碼中test_real.c中改的,部分函式可參見原始碼,這裡不再列出

int i =0;

int nfft =8;

kiss_fft_cpx cin[nfft]

; kiss_fft_cpx cout[nfft]

; kiss_fft_cpx sout[nfft]

; kiss_fft_cfg kiss_fft_state;

kiss_fftr_cfg kiss_fftr_state;

kiss_fft_scalar rin[nfft *2]

; kiss_fft_scalar rout[nfft *2]

;memset

(rin,0,

sizeof

(short

)* nfft *2)

;memset

(rout,0,

sizeof

(short

)* nfft *2)

; kiss_fft_scalar zero;

memset

(&zero,0,

sizeof

(zero));

for(i =

0; i < nfft;

++i)

for(

; i < nfft *2;

++i)

printf

(" init data for kiss_fft (rin): ");

for(i =

0; i < nfft *

2; i++

)printf

("\n");

printf

(" init data for kiss_fft (cin): ");

for(i =

0; i < nfft; i++

)printf

("\n");

memset

(cout,0,

sizeof

(short

)* nfft)

;memset

(sout,0,

sizeof

(short

)* nfft)

; kiss_fft_state =

kiss_fft_alloc

(nfft,0,

0,0)

; kiss_fftr_state =

kiss_fftr_alloc

(nfft,0,

0,0)

;kiss_fft

(kiss_fft_state, cin, cout)

;kiss_fftr

(kiss_fftr_state, rin, sout)

;free

(kiss_fft_state)

;free

(kiss_fftr_state)

;printf

(" results from kiss_fft (cout): ");

for(i =

0; i < nfft; i++

)printf

("\n");

printf

(" results from kiss_fftr (sout): ");

for(i =

0; i < nfft; i++

)printf

("\n");

printf

("##### nfft=%d, inverse=%d, snr=%g\n"

, nfft,0,

snr_compare

(cout, sout,

(nfft /2)

+1))

; kiss_fft_state =

kiss_fft_alloc

(nfft,1,

0,0)

; kiss_fftr_state =

kiss_fftr_alloc

(nfft,1,

0,0)

;// 我們在這裡分別使用cout(fft api)結果和sout(fftrapi)結果來比較ifft的準確性

實數陣列是複數資料長度的兩倍,但是從原始碼可以看到int16的陣列會被強轉為kiss_fft_cpx結構體,每兩個資料會被拼成乙個kiss_fft_cpx結構體。所以總資料量長度是一致的。

但是從結果來看,basic fft api比fftr api做出來的結果更可靠一些。(result的三四行對比)

case a (使用fft api結果做ifft)

如果處理正確,得到的結果是nfft長度的複數陣列,image均為0,real部分是ifft資料。

fftr的結果在大於nfft長度時就開始偏離了

case b (使用fftr api結果做ifft)

fftr api結果不可用於fft的ifft處理。

fftr的結果在大於nfft長度時就開始偏離了

fftapi和fftrapi不要混用

ifft後的實數結果只能使用nfft長度,而不能使用2*nfft長度。因為資料實際上是來自kiss_fft_cpx的,資料image部分占用了nfft長度,而且都為0.

資料越長,ifft還原越存在偏離

資料值偏小,如均值小於20,可能ifft還原後的資料大量為0. 解決方案是可以先將原始資料乘nfft,ifft後不要再乘nfft了,就是這個動作前置。

關於SpringBoot使用過程中的一些問題1 0

總結分析 idea基本設定裡propeties files properties 語言為gbk,應該改為utf 8。解決方案 在file settings editor file encodings 修改de t encoding for properties files 為utf 8,且勾上tra...

Metricbeat使用過程中的一些坑

使用metricbeat7.4監控elasticsearch 6.4 es 7.x使用metricbeat收集elasticsearch監視資料 es 6.x暫停資料收集 可選 metricbeat中elasticsearch xpack模組,檢視日誌時,metricbeat服務並沒有出現報錯,但是...

Tomcat 使用過程中的一些技巧

原因 tomcat預設的在url傳輸時是用iso8859 1編碼。解決方案一 在使用get傳輸引數時,將引數中的中文轉換成url格式,也就是使用urlencode和urldecode來傳輸,使用這種方式就是把中文轉換成以 開頭的編碼在url中傳輸。使用這種方法時,要注意兩點。1.前台使用urlenc...