opencv의 dft 함수를 사용하여 신호를 필터링하려고합니다. 나는이 시도하는 방법은 시간 영역에서 신호를 취하고있다 :OpenCV DFT_INVERSE가 Matlab의 ifft와 다릅니다
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;
}
}
그것을 다시 변환 :
cv::dft(x, x_fft, cv::DFT_COMPLEX_OUTPUT, 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
OpenCV의 CV : 후 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의 결과를 플로팅하기로 결정했으며 놀랍게도 매우 유사했습니다.
상상 부품
실제 부품 :
그래서 분명히 배율 인수에 대해 뭔가입니다. 원소를 원소로 나누면이 인자는 32 - 신호의 길이입니다. 왜 이런 일이 일어 났는지 설명 할 수 있습니까? 분명한 해결책은 cv::dft(x_fft, x_filt, cv::DFT_INVERSE+cv::DFT_SCALE, 0);
을 사용하는 것입니다. 그래서이 주제에 대한 답을 얻었지만 아직도 왜 이런 식으로 관심을 가지고 있습니까?
FFT bin을 제로로하여 주파수를 "제거"하려고하면 결과에 많은 노이즈가 추가 될 수 있습니다. 실제 결과를 얻으려면 IFFT 입력이 공액 대칭이어야합니다. 즉, 높은 빈은 낮은 빈의 허수 부분을 미러링해야하며 0이되지 않아야합니다. – hotpaw2
왜'cv :: dft (x, x_fft, cv :: DFT_COMPLEX_OUTPUT, 0);'에'DFT_COMPLEX_OUTPUT'을 사용합니까? 나는 또한이 문제가있다. DFT_COMPLEX_OUTPUT 플래그를 설정하면 길이가 2N 인 벡터를 얻고이 벡터에서 필터링을 어떻게 수행 할 것인가? DFT_COMPLEX_OUTPUT 플래그가 없으면 N 길이 벡터를 얻고 필터링의 차이점은 무엇입니까? –
누구에게 : iOS가 프레임 워크와 openCV를 가속화하고 크기 차이가 2 인 경우 동일한 문제가 발생합니다. 또한 결과가 동일하게 구성되지 않습니다. openCV에서 내 이해 (cannt find docs)에 대한 첫 번째 요소는 0 주파수 그리고 진짜 img 진짜 img .. 가속 프레임 워크에서 진짜 img 진짜 방법입니다 .. 편집 : 좋아 openCV의 문서는 그것이 진짜 (0) 진짜 (1) img (1) 진짜 2) img (2) .. http://docs.opencv.org/modules/core/doc/operations_on_arrays.html#dft – dowi