2014-01-07 36 views
3

我嘗試使用opencv的dft函數來過濾信號。我嘗試這種方式走的是信號的時域:OpenCV DFT_INVERSE不同於Matlab的ifft

cv::dft(x, x_fft, cv::DFT_COMPLEX_OUTPUT, 0); 

消除不需要的頻率:

for(int k=0; k<32;k++){ 
     if(k==0 || k>6) 
     { 
      x_fft.ptr<float>(0)[2*k+0]=0; 
      x_fft.ptr<float>(0)[2*k+1]=0; 

     } 
    } 

將其轉換回

x = [0.0201920000000000 -0.0514940000000000 0.0222140000000000 0.0142460000000000 -0.00313500000000000 0.00270600000000000 0.0111770000000000 0.0233470000000000 -0.00162700000000000 -0.0306280000000000 0.0239410000000000 -0.0225840000000000 0.0281410000000000 0.0265510000000000 -0.0272180000000000 0.0223850000000000 -0.0366850000000000 0.000515000000000000 0.0213440000000000 -0.0107180000000000 -0.0222150000000000 -0.0888300000000000 -0.178814000000000 -0.0279280000000000 -0.144982000000000 -0.199606000000000 -0.225617000000000 -0.188347000000000 0.00196200000000000 0.0830530000000000 0.0716730000000000 0.0723950000000000] 

用它轉換爲傅立葉域到時間域:

cv::dft(x_fft, x_filt, cv::DFT_INVERSE, 0); 

爲了檢查我的結果,我將它們與Matlab進行了比較。我採用了相同的信號x,使用x_mfft = fft(x);將其轉換爲FOURIER結果與我從opencv獲得的結果相似,除了opencv中只有左側,而在matlab中我也獲得了對稱值。 之後,我在Matlab中設置爲0,x_mfft(0) and x_mfft(8:32)的值與現在的信號看起來完全相同,除了在Matlab中它們是複雜形式的事實,而在opencv中它們是分開的,一個通道中的實部,其他。

問題是,當我使用x_mfilt = ifft(x_mfft)在matlab中執行逆向變換時,結果與我使用opencv得到的結果完全不同。 Matlab的

0.0126024108604191 + 0.0100628178150509i 0.00278762121814893 - 0.00615997579216921i 0.0116716145588075 - 0.0150834711251450i 0.0204808089882897 - 0.00937680194210788i 0.0187164132302469 - 0.000843687942567208i 0.0132322795522116 - 0.000108642129381095i 0.0140282455278201 - 0.00325620843335947i 0.0190436542174946 - 0.000556561558544529i 0.0182379867325824 + 0.00764390022568001i 0.00964801276734883 + 0.0107158342431018i 0.00405220362962359 + 0.00339496875258604i 0.0108096973356501 - 0.00476499376334313i 0.0236507440224628 - 0.000415067678294738i 0.0266197220512826 + 0.0154626911663024i 0.0142805873081583 + 0.0267004219364679i 0.000314527358302778 + 0.0215255889620223i 0.00173512964620177 + 0.00865151513638104i 0.0169666351363477 + 0.00836162056544561i 0.0255915540012784 + 0.0277878383595920i 0.0118710562486680 + 0.0506446948330055i -0.0160165379892836 + 0.0553846122152651i -0.0354343989166415 + 0.0406080858067314i -0.0370261047451452 + 0.0261077990289579i -0.0365120038155127 + 0.0268311542287801i -0.054184164.0312446266697320i -0.0854132555297956 + 0.0125342802025550i -0.0989182320365535 - 0.0377079727602073i -0.0686133217915410 - 0.0925138855355046i -0.00474198249025186 - 0.111728716441247i 0.0515933837210975 - 0.0814138940625859i 0.0663201317560107 - 0.0279433757588921i 0.0426055814586485 + 0.00821080477569232i 

CV後的OpenCV :: DFT(x_fft,x_filt,CV :: DFT_INVERSE,0);

通道1:

0.322008 -0.197121 -0.482671 -0.300055 -0.026996 -0.003475 -0.104199 -0.017810 0.244606 0.342909 0.108642 -0.152477 -0.013281 0.494806 0.854412 0.688818 0.276848 0.267571 0.889207 1.620622 1.772298 1.299452 0.835450 0.858602 0.999833 0.401098 -1.206658 -2.960446 -3.575316 -2.605239 -0.894184 0.262747 

通道2:

0.403275 0.089205 0.373494 0.655387 0.598925 0.423432 0.448903 0.609397 0.583616 0.308737 0.129670 0.345907 0.756820 0.851827 0.456976 0.010063 0.055522 0.542928 0.818924 0.379870 -0.512527 -1.133893 -1.184826 -1.168379 -1.733893 -2.733226 -3.165383 -2.195622 -0.151738 1.650990 2.122242 1.363375 

我缺少什麼?結果應該不相似嗎?我如何檢查opencv中的逆變換是否正確完成?

後編輯: 經過幾個小時的努力掙扎幾個小時後,我決定從Matlab和OpenCV繪製結果,令我驚訝的是他們非常相似。

虛部 enter image description here

實部: enter image description here

所以,很顯然這是一些有關的比例因子。顯然,它們被逐元素分解後,這個因子是32 - 信號的長度。有人能解釋爲什麼發生這種情況嗎 顯而易見的解決方案是使用cv::dft(x_fft, x_filt, cv::DFT_INVERSE+cv::DFT_SCALE, 0);,所以我猜這個主題已經回答了,但我仍然對這種方式感興趣。

+0

試圖通過將FFT頻率歸零來「消除」頻率可能會給結果增加很多噪音。對於真實的結果,IFFT的輸入需要是共軛對稱的,這意味着高頻段必須反映低頻段的虛部,而不是零點。 – hotpaw2

+0

爲什麼在'cv :: dft(x,x_fft,cv :: DFT_COMPLEX_OUTPUT,0)'中使用'DFT_COMPLEX_OUTPUT';'。我也有這個問題。如果你設置了DFT_COMPLEX_OUTPUT標誌,那麼你會得到2N長度的矢量,並且你如何對這個矢量進行濾波。沒有DFT_COMPLEX_OUTPUT標誌,那麼我們得到N長度向量,過濾有什麼不同。 –

+0

誰曾經:與ios加速框架和openCV發生同樣的問題,並有2的規模差異也結果不組織相同 - 我的理解(無法找到文檔)在openCV中的第一個元素是實際部分0頻率,然後它是真正的img真正img ..在加速框架它是真正的img真正的img一路..編輯:好的文檔在openCV說它是真實的(0)真實(1)img(1)真正的2)img(2).. http://docs.opencv.org/modules/core/doc/operations_on_arrays.html#dft – dowi

回答

2

對於所有FFT庫使用的比例因子沒有標準。有些不使用,有的使用比例因子1/N,大約1/sqrt(N)。您必須測試或查看每個特定庫的文檔。