Real time FFT & IFFT with low pass filter
조회 수: 5 (최근 30일)
이전 댓글 표시
I am processing the signal from MPU6050. Applying FIR filter in the frequency domain and then taking IFFT to get filtered signal but getting some spikes in the output signal. Searched a lot about it and found here exit spectral leakage. Found some solutions like zero paddings and windowing but nothing is working. Can some one take a look and let me know what I am doing wrong here.
Here is what I am getting ![recontructed.PNG](https://www.mathworks.com/matlabcentral/answers/uploaded_files/230792/recontructed.png)
![recontructed.PNG](https://www.mathworks.com/matlabcentral/answers/uploaded_files/230792/recontructed.png)
Zoom in graph
![Zoom.PNG](https://www.mathworks.com/matlabcentral/answers/uploaded_files/230793/Zoom.png)
More Zoom
![zoom2.PNG](https://www.mathworks.com/matlabcentral/answers/uploaded_files/230794/zoom2.png)
Complete Code
close all; clear all ;clc; delete(instrfindall);
arduino=serial('COM6','BAUD', 115200);
fopen(arduino);
java.lang.Thread.sleep(0.01); % in mysec!
samples = pow2(nextpow2(5000))
sig = []; out_sig =[0]; tic; G=0; trying=0; pingpong = 0;
while 1
idn = fscanf(arduino);
xx = str2double(idn);
if isnan(xx)
fclose(arduino);
java.lang.Thread.sleep(1); % in mysec!
fopen(arduino);
java.lang.Thread.sleep(1); % in mysec!
trying = trying + 1
continue
else
sig = [sig xx];
end
if length(sig)>samples - 1
break
end
end
fclose(arduino);
plot(sig,'g'); %---------------------------->Orginal signal <---------------------------
hold on
PG = plot(out_sig,'k'); %---------------------------->Output signal <---------------------------
PG.YDataSource = 'out_sig';
SegmentLength = pow2(nextpow2(1000)) % Transform length to next pow of 2
Fs = SegmentLength;
wiin = hann(64,'symmetric');
filtcoeff = fir1(63, 20/Fs, 'low', wiin, 'scale');
firfilterimpresp = impz(filtcoeff);
filterffte = fft(firfilterimpresp,SegmentLength); % FFT of impulse response of filter/system
ChunkStart = 1;
ChunkEnd = SegmentLength;
sigblock = [];
for t = 1:samples/SegmentLength
sigblock = sig(ChunkStart:ChunkEnd);
blockfft = fft(sigblock,SegmentLength);
out_sigg = real(ifft(blockfft.*filterffte'));
out_sig = [out_sig out_sigg];
refreshdata
drawnow
ChunkStart = ChunkEnd;
ChunkEnd = ChunkEnd + SegmentLength -1 ;
end
댓글 수: 2
Star Strider
2019년 7월 22일
If you want to filter in the frequency domain, the Signal Processing Toolbox has the fftfilt function.
답변 (0개)
참고 항목
카테고리
Help Center 및 File Exchange에서 Digital Filter Analysis에 대해 자세히 알아보기
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!