# low pass filtering for smoothing

I am using the following code in Matlab, from some source (sadly I cant remember).
The code is used for smoothing signals using a low pas filter.

 function y = fftSmooth(resp,srateCorrectedSmoothedWindow)
L      = length(resp);
window = zeros(1,L);
window(floor((L-srateCorrectedSmoothedWindow+1)/2)...
:floor((L+srateCorrectedSmoothedWindow)/2))=1;

% zero phase low pass filtering
tmp = ifft(fft(resp).*fft(window)/srateCorrectedSmoothedWindow);
y=-1*ifft(fft(-1*tmp).*fft(window)/srateCorrectedSmoothedWindow);


I have removed some unnecessary parts to shorten the code.

My question: how exactly is the filter designed (the last two lines)? Shouldn't it be in the time domain?

• I think what you mean is "how is the filtering implemented" (which is different from how the filter is designed). The answer to that is it's implemented in the frequency domain, which is perfectly fine. I wouldn't have implemented it as such though, but that's a different topic.
– Jdip
Oct 18, 2022 at 18:10
– Jdip
Oct 18, 2022 at 18:13
• @Jdip, thanks, its was very useful. Oct 18, 2022 at 19:40

The code apparently originate from BreathMetrics (Matlab toolbox for analyzing respiratory recordings): breathmetrics/fftsmooth.m. It is descripted in Automated analysis of breathing waveforms using BreathMetrics: A respiratory signal processing toolbox, Chemical Senses, 2018. A draft is here.

Below, the function is visualyy decomposed into frequency/time steps. As @Jdip wrote, that is a filter implementation in the frequency domain.

%%% function y = fftSmooth(resp,srateCorrectedSmoothedWindow)

%Set inputs
lResp = 2048;
resp = randn(1,lResp)+10*exp(-(((1:lResp)-lResp/2)/(0.01*lResp)).^2);
srateCorrectedSmoothedWindow = 16;

L      = length(resp);
window = zeros(1,L);
window(floor((L-srateCorrectedSmoothedWindow+1)/2)...
:floor((L+srateCorrectedSmoothedWindow)/2))=1;

% zero phase low pass filtering
tmp = ifft(fft(resp).*fft(window)/srateCorrectedSmoothedWindow);
y=-1*ifft(fft(-1*tmp).*fft(window)/srateCorrectedSmoothedWindow);

figure(1);clf
subplot(2,1,2)
plot([resp;y]')
axis tight;legend('Time Signal','Time Signal filtered')
subplot(2,1,1)
yyaxis left
plot(abs(fft(resp)))
yyaxis right
plot(abs(fft(window)))
axis tight;legend('Spectrum','Window') 