Phase distortion demo

Illustration of phase distortion (change of waveform shape). It is demonstrated that a linear-phase filter can preserve the shape of the waveform.

Ivan Selesnick, selesi@nyu.edu

Contents

Start

clear

Create signal

N = 200;
n = 0:N-1;

om1 = 0.1*pi;
om2 = 0.2*pi;

x = cos(om1*n) + sin(om2*n);        % Input signal

figure(1)
clf
subplot(2, 1, 1)
plot(n, x)
title('Input signal')

Filter 1

load filter1.mat  % loads b1, a1    % Load filter 1 (computed previously and saved)
b1                                  % b1, a1 : coefficients of difference equation
a1

[H1, om] = freqz(b1, a1);           % Compute frequency response
f = om/(2*pi);                      % Frequency (cycles/sample)

figure(1)
clf
plot(f, abs(H1))
xlabel('Frequency')
title('Frequency response magnitude')
b1 =

   -0.0312         0    0.2812    0.5000    0.2812         0   -0.0312


a1 =

     1

Output 1

The output signal looks the same as the input signal, except delayed. The input signal is in the pass-band of the filter.

y1 = filter(b1, a1, x);             % Apply filter 1 to signal x

figure(1)
clf
subplot(2, 1, 1)
plot(n, x)
title('Input signal')
subplot(2, 1, 2)
plot(n, y1)
title('Output of filter 1')

Filter 2

load filter2.mat % loads b2 a2      % Load filter 2 (previously computed and saved)
b2
a2

[H2, om] = freqz(b2, a2);           % Compute frequency response

figure(1)
clf
plot(f, abs(H2))
title('Frequency response magnitude')
xlabel('Frequency')
b2 =

  Columns 1 through 7

   -0.0253    0.0523    0.1966   -0.0657   -0.3277    0.0293    0.2559

  Columns 8 through 9

    0.0523   -0.0312


a2 =

    1.0000   -1.6736    0.8100

Output 2

Output 2 differs in waveform shape from output 1. Why is that?

y2 = filter(b2, a2, x);             % Apply filter 2 to signal x

figure(1)
subplot(2, 1, 1)
plot(n, x)
title('Input signal')
subplot(2, 1, 2)
plot(n, y2)
title('Output of filter 2')

Compare magnitude responses

Do y1 and y2 differ because filter 1 and 2 have different frequency response magnitudes? No, both filters have the same frequency response magnitude.

figure(1)
clf
plot(f, abs(H1), '-', f, abs(H2), '--')
legend('Filter 1', 'Filter 2')
xlabel('Frequency')
title('Magnitude responses')

Compare phase responses

Do the filters have different phase responses?

figure(1)
clf
plot(f, angle(H1), f, angle(H2), '--')
legend('Filter 1', 'Filter 2')
title('Phase responses')
xlabel('Frequency')

% Yes, the phase responses are different.
% Filter 1 has linear phase (it delays all frequencies by the same amount).
% Filter 2 has nonlinear phase (it delays different frequencies by
% different amounts).

Add noise

load noise_data.mat             % load variable 'noise' (previously computed and saved)

r = x + noise;                  % Add noise to input signal

figure(1)
clf
subplot(2, 1, 1)
plot(r)
title('Noisy input signal')

Filter the noisy signal

Filter 1 removes the noise and preserves the signal waveform. Filter 2 removes the noise but DISTORTS the signal waveform.

y1 = filter(b1, a1, r);
y2 = filter(b2, a2, r);

figure(1)
clf
subplot(3, 1, 1)
plot(x)
title('Original signal')
subplot(3, 1, 2)
plot(y1)
title('Output of filter 1')
subplot(3, 1, 3)
plot(y2)
title('Output of filter 2')

Impulse responses

Filter 1 has a symmetric impulse response (it has linear phase). Filter 2 has a non-symmetric impulse response (it does not have linear phase).

imp = [1 zeros(1, 50)];
h1 = filter(b1, a1, imp);
h2 = filter(b2, a2, imp);

figure(1)
clf
subplot(2, 1, 1)
stem(0:50, h1, '.')
title('Impulse response - filter 1')

subplot(2, 1, 2)
stem(0:50, h2, '.')
title('Impulse response - filter 2')

Conclusion

The linear phase filter (filter 1) is preferable because it removes the noise without changing (distorting) the waveform.