Why do I observe a shift in mean when using the DECIMATE function in MATLAB 6.5 (R13)?

7 views (last 30 days)
When I use the DECIMATE function using the following command:
load p3.txt
plot(p3(:,1),p3(:,2),'k.');
grid on; hold on;
y=decimate(p3(:,2),31);
y2=decimate(p3(:,2),31,n);
t=linspace(p3(1,1),p3(end,1),255)';
p3dec31=[t y];
plot(p3dec31(:,1),p3dec31(:,2),'g*',t,y2,'go');
[mean(p3(:,2)) mean(y)]
I observe a shift in the mean when viewing the plot. I can also verify the same from the command line:
[mean(p3(:,2)) mean(y)]
as these two values are different.

Accepted Answer

MathWorks Support Team
MathWorks Support Team on 27 Jun 2009
The shift in the mean is caused by the order of the filter used in DECIMATE. By default, an 8th order Chebyshev Type I Low Pass Filter is used as an anti-aliasing filter before removing samples. However, there is a cost function that evaluates the magnitude response of the filter at the cut-off frequency to determine the filter order. Depending on the machine used (Intel Pentium, AMD Athlon, etc) and the operating system (Windows XP, Linux, etc), different numerical libraries produce different results in the cost function and as a result, different filter orders are selected for the same DECIMATE command.
Even order filters generate a 0.05 dB attenuation at f = 0, which then produces the shift in the mean. Odd order filters do not exhibit this behavior at f = 0 and hence do not produce the shift in the mean.
The workaround is to use DECIMATE with the FIR filter option. The FIR filter does not have a 0.05 dB attenuation at f = 0 and hence the shift in mean does not appear in the downsampled signal.
The reason for evaluating the cost function that computes the magnitude response of the filter at the cut-off frequency is that as the passband-edge frequency decreases, the filter that is designed may degenerate for the default 8th order filter. You can see the distortion by following these steps:
1. Start MATLAB
2. Open decimate.m
3. Put a breakpoint on line 126 of decimate.m
4. In the Command Window, enter the following command:
decimate([1:10],61)
5. When MATLAB breaks at line 126, view the 8th order Chebyshev Type I IIR filter by entering the following command:
fvtool(b,a)
6. Zoom into the cut-off frequency of the filter and you will notice that the passband has significant distortion.
The distortion is caused by forming the transfer function from poles and zeros and the roundoff error that accumulates from the convolutions involved. By lowering the filter order, we can reduce this distortion significantly. You can verify this by resuming the MATLAB debugger and viewing the frequency response of the 7th, 6th, etc order filters at the cutoff frequency.
  1 Comment
Alaa Hameed
Alaa Hameed on 1 Mar 2018
Dose that mean it will affect the statistic of the signal?if so, how I make sure that my decimated signal will give me the same statistics I am expecting from the original signal

Sign in to comment.

More Answers (1)

Robert Reed
Robert Reed on 21 Jan 2022
STILL BROKEN AFTER 13 YEARS?
I have MATLAB SIgnal Processing Toolbox Version 8.5 (R2020b). Why is this problem with the default mode of the 'decimate' function still around in 2022, 13 years later? At the minimum, can you please place a warning message in the decimate function to alert the user? Or automatically exclude the use of even-order Chebshev anti-aliasing filter?
Thank you, Robert A. Reed

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!