Real time FFT & IFFT with low pass filter
5 visualizaciones (últimos 30 días)
Mostrar comentarios más antiguos
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 comentarios
Star Strider
el 22 de Jul. de 2019
If you want to filter in the frequency domain, the Signal Processing Toolbox has the fftfilt function.
Respuestas (0)
Ver también
Categorías
Más información sobre Digital Filter Analysis en Help Center y File Exchange.
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!