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...