Вы находитесь на странице: 1из 37

ELEC 484 Audio Signal Processing

Assignment 3:
Filter Implementations
Wah-wah Filter, Comb Filters, Allpass Filter

Prepared for:
Peter Driessen
ELEC 484
University of Victoria

Prepared by:
Tim I. Perry
V00213455
May, 2009

Tim Perry
V00213455
2009-05-21

CONTENTS
PART 1: Wha-Wha Filter Derived from 2nd Order Allpass .......................................................................... 2
PART 2: Convolution of two Audio Files .................................................................................................... 5
PART 3: FIR and IIR Comb Filter Derivations ............................................................................................ 7
PART 4: FIR and IIR Comb Filter Implementation ................................................................................... 13
PART 5: Vibrato Effect .............................................................................................................................. 18
PART 6: Second Order Allpass Filter Design ............................................................................................ 19
PART 7: Second Order Allpass Filter Group Delay ................................................................................... 22
PART 8: Sound Collage Using Filtered White Noise................................................................................. 24
REFERENCES ........................................................................................................................................... 27
APPENDIX A ............................................................................................................................................. 27

Tim Perry
V00213455
2009-05-21

ELEC 484 ASSIGNMENT 3


Implementations of: Wah-wah Filter, Comb Filters, Allpass Filter
PART 1: Wha-Wha Filter Derived from 2nd Order Allpass
The wah-wah filter that was designed in Assignment 2 is implemented here using the second order
bandpass filter on page 43 of the DAFX text. This structure is based on the allpass filter (page 41 of
DAFX). The center frequency is altered often enough to make a smooth sound without noticeable
transients.
For this implementation, the following filter specifications were used:





sampling rate f_s = 44,100 Hz


center frequency f_1 = 44,100/32 = 689 Hz
3dB bandwidth B = 100 Hz
implementation uses 2 poles and 2 zeros

Figure 1 is the block diagram for a tuneable second order allpass filter, denoted A(z). From this structure,
the tuning parameters c and d are used to implement a second order BPF.

Figure 1: Second-order allpass filter block diagram [1]

Tim Perry
V00213455
2009-05-21
For the allpass filter of Figure 1:
 =

 + 1  +  
1 + 1   

For a second-order bandpass/bandreject filter:


1
 = 1     
2

!1

=
2
tan 
!+1

tan 

2%
= cos 
!


(1)

(2)

(3)

(4)

Figure 2: Second-order bandpass and bandreject implemented with allpass filter [1]

Therefore, the second order bandpass transfer function can be expressed as:
(
+ + ,( +' ( + ' )
&' = *(
)
( + ,( +' ( +' )



(5)

cut-off frequency (phase = -180, group delay is maximum) is controlled


by the coefficient d
bandwidth is controlled by the coefficient c

Expanding this, we can find the a and b parametric filter coefficients. The  terms in the numerator
cancel out, and the resulting form is analogous to the BPF seen in assignment 2:
1  + 1  + 1 
 = *
2 1 + 1   
For constructing the filter in Matlab, the coefficient arrays are implemented as:
b = [(c+1) 0 (c+1)];
a = 2*[(1 d*(1-c) -c];

Tim Perry
V00213455
2009-05-21

MATLAB Code for Part 1


%==========================================================================
% a3part1_Wha.m
Author: Tim Perry
% Elec484: DAFX
V00213455
% Assignment 3, Part 4
2009-05-21
%
% Repeat the wah-wah filter from Assignment 2, but using the second order
% bandpass filter on page 43 of the DAFX text (based on the allpass
% filter on page 41). Adjust the center frequency of the bandpass often
% enough to make a smooth sound without transients.
%==========================================================================
clear all;
close all;
%-------------------------------------------------------------% Filter specifications and constants
%-------------------------------------------------------------f_s = 44100;
f_1 = 689;
% Default center frequency (sweep f_c with respect to f_1)
B = 100;
% 3dB bandwidth is 100 Hz
whaSpeed = 0.45;
% Multiplier for filter sweep frequency
sweepRange = 0.5;
% Multiplier for range of filter sweep
%-------------------------------------------------------------% Read Input Sound file, get sampling freq and bit rate
%-------------------------------------------------------------[audio,f_s,bps]=wavread('white_noise.wav');
% Get length of file in samples
numSamples = length(audio);
dN = 50; % increment samples for each loop iteration
%---------------------------------------------------------------% Apply wha-wha filter to audio file
%---------------------------------------------------------------for n = (0:dN:numSamples-1)
f_c = f_1*(1 + sweepRange*cos(2*pi*whaSpeed*n/f_s));
% change center
frequency
% allpass filter form (Pg 41-43, DAFX) coefficients
d = -cos(2*pi*f_c/f_s);
% apply new f_c to d param
c = (tan(pi*B/f_s)-1)/(tan(2*pi*B/f_s)+1); % controls the bandwidth
% standard parametric filter coefficients
a = 2*[1 d*(1-c) -c];
% update denominator terms
b = [(c+1) 0 (c+1)];
% update numerator terms (if bandwidth altered)
y(n+1:n+dN) = filter(b, a, audio(n+1:n+dN));
% filter audio
end
y = (1/(2.*max(y))).*y;
% lower amplitude to prevent wavwrite clipping
wavwrite(y,f_s,bps,'a3pt1-wha.wav');

Tim Perry
V00213455
2009-05-21
Figure 3 contains the output spectrums of the above Matlab script, with two different choices for
parameters. The first is a typical sweeping about 689 Hz. The second version uses a higher value of 10 for
the sweep range multiplier variable, and the odd high frequency effects are the result of negative values
for f_c being calculated and then reflected back into the positive frequency spectrum.

Figure 3: Output spectrum for two versions of the Matlab implemented wha filter. Typical paremeters (top),
"lazer_wha" parameters with sweep range multiplier set to 10 (bottom). In both cases, the center frequency is
clearly time-varying.

PART 2: Convolution of two Audio Files


Toms Diner and the flute2.wav were convolved with a high tempo drum sample from an old project of
mine. The result is a rhythmic (and distorted) versions of the original sound files; however, the timbre of
the original drums is not present. Its apparent that the convolution process mapped the spectral content of
the input file onto the transients of the drum track, such the amplitude of the entire file is increased during
a drum hit. There are certainly comb filtering effects, which in practical applications are an important
element of convolution reverb (subtle, diffuse comb filtering is perceived as ambience).

Waveform images of the convolution results are presented in the figures below. To avoid clipping when
executing the Matlab wavwrite command, the output sample amplitudes were scaled down.

Tim Perry
V00213455
2009-05-21

Figure 4: Original Tom's Diner (top), "TransSiberian_Drums.wav" (center), and mono-convoluted and
scaled output file (bottom).

Figure 5: Original flute2.wav (top), "TransSiberian_Drums.wav" (center), and mono-convoluted and


scaled output file (bottom).

Tim Perry
V00213455
2009-05-21

PART 3: FIR and IIR Comb Filter Derivations


For the FIR comb filter with delay M=4, starting with the difference
equation, derive the transfer function, find the poles and zeros and sketch
them in the z plane, plot the frequency response and the impulse response.
Repeat for the IIR comb filter with delay M=4.

FIR Comb Filter


The FIR comb filter simulates a single delay. The difference equation is given by:
./ = 0/ + 10/ 2
2 = 3/56

where

(6)

Deriving the transfer function for the general case:


78 = 98 + :98 ;
< = = + := >
&' =
For M = 4:

?'
= ( + 1' 2
@'

(7)

&' = ( + 1' A
 =

B + :
B

Poles:
There is a 4th order pole at z = 0.
Zeros:

0 = B + :
 = ED:

For g = 1, the 4 zeros are at:

z=







Figure 6 displays the pole-zero plot for the FIR comb filter, as displayed in WinPOI.
Figure 7 displays the frequency response and Figure 8 displays the impulse response with
g chosen to be 0.9. Figure 9 displays the block diagram as described by Equation (7).

Tim Perry
V00213455
2009-05-21

Figure 6: FIR comb filter pole-zero plot, magnitude response and phase response

Figure 7: Frequency Response of FIR Comb Filter

Tim Perry
V00213455
2009-05-21

Figure 8: Impulse Response of FIR Comb Filter (g chosen to be 0.9)

Figure 9: FIR Comb Filter block diagram

IIR Comb Filter


The IIR comb filter produces an infinite series of responses y(n) to an input signal x(n). The delay
line provides attenuation by g (Figure 10). Additional scaling by c can be applied at the input
signal in order to compensate for the systems high amplification [1].

Figure 10: IIR Comb Filter block diagram

Tim Perry
V00213455
2009-05-21
The difference equation for the IIR comb filter is given by:
./ = +0/ + 1./ 2
where

2 = 3/56

(8)

Deriving the transfer function for the general case:


78 :78 ; = 98
< : > < = =
<1 : >  = =
&' =

?'
+
=
@' ( 1' 2

 =

<

=
= 1 : B

(9)

For delay M = 4:

 =

 B
B :

Poles:
 = ED:
This results in 4 poles in the complex plane with magnitude g at angles of:

For stability,


3
0, , ,
2
2
|:| 1

Zeros:
There is a 4th order zero at z = 0.
The pole-zero plot for the IIR filter is shown in Figure 11. In practice, the poles will lie inside the
unit circle as opposed to right on it. This is to ensure that there is an attenuated signal in the
feedback loop. |:| 1 is a necessary condition for stability. The pole-zero plot, frequency
response, and impulse response plots are shown below. For the FR and IR plots, the feedback
loop gain g was set to 0.8.
10

Tim Perry
V00213455
2009-05-21

Figure 11: IIR comb filter pole-zero plot, magnitude response and phase response.

Figure 12: Frequency Response of FIR Comb Filter with delay line gain g set to 0.8

11

Tim Perry
V00213455
2009-05-21

Figure 13: Impulse Response of IIR Comb Filter with delay line gain g set to 0.8

Universal Comb Filter

Figure 14: Parameter Table and Block Diagram for a Universal Comb Filter [1]. Both the
FIR and IIR comb filters may be implemented with this general structure.

12

Tim Perry
V00213455
2009-05-21

PART 4: FIR and IIR Comb Filter Implementation


Implement and test both IIR and FIR comb filters with delays in the
range from 0 to 100 msec. The sound effect will be different depending
on the delay. Using the Tom's Diner.wav and the flute.wav sound sample,
describe the sound effect and the corresponding range of delays, and explain
the result.
See Table 3.4 on page 71 for some ideas.

FIR Comb Filter


The perceived effects resulting from passing the audio files through the for the FIR comb filter with
various delays are summarized in Table 1.

Delay Time
(ms)
0

10

30

50

100

Table 1: FIR Comb Filter Effects with g= 0.9


Effects on Toms Diner
Effects on Flute 2
No change. An increase in amplitude is
expected due to the doubling of signals,
however, the output was reduced to
prevent clipping.
Metallic vocal timbre is present,
resulting from out of phase identical
signals occurring closely together in
time. There is a loss in vocal clarity.
Metallic timbre is still present, but a
doubling/thickening effect is also
starting to become pronounced as a
result of the wider separation between
voices.
Clear echo on transients (particularly the
hard consonants) can now be heard, in
addition to the previous effects.
There is now a clear delayed voice, and
the wider separation has reduced the
Metallic effect. The resulting effect is
a single echo, although higher in
amplitude than a naturally occurring
Initial Time Delay Gap (g=-0.9 seems
too large for a reflection occurring at
100ms)

Same effects as those o


Toms Diner.

Subtle thickening of sound.

Loss in clarity and obscured vibrato (more


of a tremolo) due to out of phase amplitude
variations.

When the vibrato speeds up toward the end,


the flute seems to separate into two distinct
voices. Overall: thicker sound, loss of clarity.
Altering of dynamics (see Figure 19),
distortion and partial elimination of vibrato
(see discussion below), loss of clarity,
thickening of sound, and apparent addition of
a second voice. Multiple oscillations in
amplitude from the distorted vibrator are
apparent, and oscillating at different
frequencies.

For lower delay times, the effects on the vocal timbre were more noticeable than the flute. However, the
effects of comb filtering were particularly pronounced for the flute sample that was filtered through the
FIR comb filter with 100ms delay. The interference caused by the out of phase copy of the original signal
causes the flute vibrato (flute vibrato is actually closer to a tremolo) to be altered. Since the flutes
vibrato is essentially a tremolo, the amplitude variations are distorted by the comb filtering, and the
overall dynamics are altered. Additionally, a thickening of texture, loss of clarity, and the typical
disorienting effects of extreme comb filtering are present. This effect would be more significant if the
delay gain parameter g was set to 1 (for the FIR comb filtered audio files, a value of g= 0.9 was used).
13

Tim Perry
V00213455
2009-05-21

Figure 15: Response of FIR comb filter applied to Tom's Diner with 0ms delay.

Figure 16: Response of FIR comb filter applied to Tom's Diner with 10ms delay.

Figure 17: Response of FIR comb filter applied to Tom's Diner with 100ms delay.

14

Tim Perry
V00213455
2009-05-21

Figure 18: FIR comb filter response to flute2.wav as input; delay time = 10ms.

Figure 19: FIR comb filter response to flute2.wav as input; delay time = 100ms.

15

Tim Perry
V00213455
2009-05-21

FIR Comb Filter


The perceived effects resulting from passing the audio files through the for the IIR comb filter with
various delays are summarized in Table 1. To achieve an effect without over modulating the input sound,
the delay loop gain g was set to 0.5. However, the IIR comb filter was also tested with higher feedback
loop gains.

Delay Time
(ms)
0

10
30
50

100

Table 2: FIR Comb Filter Effects with default g= 0.5


Effects on Toms Diner
Effects on Flute 2
No change. An increase in amplitude is
expected due to the doubling of signals,
however, the output was reduced to
prevent clipping.
Metallic vocal timbre is present, as in
the FIR case.
Metallic timbre is enhanced, and there
is a significant loss in vocal clarity.
The effects described above are
enhanced. The series of delays that can
be perceived have a hollow sound
similar to flutter echo. Echo is very
pronounced on the transients, and comb
filtering has distorted the source sound
significantly.
The first delay creates a noticeable echo
voice, and the initial sound resembles a
very un-diffuse reverb. Toward the end,
successive delays begin to stack up.

Same effects as those o


Toms Diner.

Thickening of sound.
Thickening of sound and subtle smoothing of
transients.
As time progresses, multiple flute voices can
be perceived.

With g = 0.5, there is a significant thickening


of the sound, resembling multiple flutes
playing in unison. In addition, there is an
impression of ambiance (expected, as subtle
comb filtering is an important element of
reverb). There is also a loss of clarity due to
the delays, which are out of phase from the
original signal and therefore cause distortion
to the waveform.

As g approaches 1 for the IIR comb filter, successive delays decay so slowly that they stack up as time
progresses (Figure 22), making for an unnatural but interesting sounding effect. If g is greater than 1
(corresponding to poles outside of the unit circle), the system is unstable (Figure 23) and will quickly
blow up toward infinity.

16

Tim Perry
V00213455
2009-05-21

Figure 20: IIR comb filter response to flute2.wav as input; delay time = 0ms, g = 0.5.

Figure 21: IIR comb filter response to flute2.wav as input; delay time = 100ms, g = 0.50.

17

Tim Perry
V00213455
2009-05-21

Figure 22: IIR comb filter response to flute2.wav as input; delay time = 100ms, g = 0.9.

Figure 23: IIR comb filter response to flute2.wav as input; delay time = 100ms, g = 1.1 (left) and g = 1.3
(right). These filters are unstable.

PART 5: Vibrato Effect


Add a vibrato effect to a steady pitched sound (single instrument melody)

The vibrato effect was implemented in the time domain, using the algorithm presented on page 69 of
DAFX [1]. A typical modulation frequency of 4Hz was chosen (around average for human vocals, which
other instruments tend to mimic). I originally tried to apply this algorithm to a cello sample; however,
there were some implementation problems that were taking a very long time to work around. In the end,
the vibrato was applied to a sinusoid oscillating at 110Hz (a low A).
The sine wave makes it easy to view the effects of vibrato, which is a relatively slow and narrow
oscillation in pitch that deviates about the fundamental frequency of a tone. Without vibrato, we would
expect to see a constant spectrum for a sin wave.

18

Tim Perry
V00213455
2009-05-21

Figure 24: Vibrato effect applied to sine wav

PART 6: Second Order Allpass Filter Design


Design a second order allpass filter. Show the pole and zero locations
and use POI to verify the amplitude and phase response are as expected.

The second-order allpass filter was used to create the wha BP filter of Part 1. From Equations (1), (3) and
(4), the transfer function for the allpass filter is:
 =

 + 1  +  
1 + 1   


tan   ! 1

=
2
tan 
!+1

2%
= cos 
!


19

Tim Perry
V00213455
2009-05-21

Figure 25: Second-Order Allpass Filter block diagram [1]

To construct a second-order allpass filter with with real coefficients, two allpass pole-zero couples must
be multiplied together, where the poles are complex conjugates. The steady state magnitude must be
constant over the entire frequency range, therefore:
WW
|N OP Q| = Q|RST UV = Q
Y
= Z
XX RST UV
Therefore the allpass filter must satisfy:

Z is the transfer function gain

W = ZX

such that the zeros are the images of the poles.


Choosing the poles to be the complex conjugates:
Oe

b = 0.9N B ,

b = 0.9N

Oe
B

The corresponding image zeros will lie diagonally opposite the poles in the z-plane. This means that the
zeros will be located outside the unit circle at an equal distance to the unit circle as the poles, with the
same angle as the poles:
Oe

 = 1.1N B ,

 = 1.1N

Oe
B

The z-plane pole zero-plot shown below. The resulting magnitude and phase response are as desired:



Unity gain at all frequencies for the magnitude response


Phase drops from 0 to -360, about the cutoff frequency +
(the phase response passes -180 at + )

20

Tim Perry
V00213455
2009-05-21

Figure 26: Pole-zero plot for allpass filter in winPOI.

Figure 27: Magnitude Response (top) and Phase Response (bottom) for all pass filter. The apparent phase
discontinuity is simply due to the axis of the plot (the phase range is from to instead of from -2 to 0).

21

Tim Perry
V00213455
2009-05-21

PART 7: Second Order Allpass Filter Group Delay


Plot the group delay of the allpass filter designed in part 6.
Verify that the group delay is the "time delay of the amplitude envelope of a
sinusoid at a particular frequency" by testing with two suitable AM signals
with carrier frequencies near the minimum and maximum group delay.

The magnitude response, phase response, and group delay of the allpass filter from part 6 are plotted in
Matlab below (Figure 28). Additionally, the two input AM waveforms are plotted, and the time delay of
the amplitude envelope can be used to determine an identical group delay (Figure 31).
From the plots below, the maximum group delay was determined to be 19 samples, occurring at 5500Hz.
This is at the cutoff frequency, where the phase response passes -180.

Figure 28: Second-order allpass filter frequency response and group delay

22

Tim Perry
V00213455
2009-05-21

Figure 29: Envelope comparison between sinusoids having maximum (top) and minimum (bottom) delay.
Modulating frequency = 30Hz

Figure 30: Envelope comparison between sinusoids having maximum (top) and minimum (bottom) delay.
Modulating frequency = 30Hz

23

Tim Perry
V00213455
2009-05-21

Figure 31: Zoomed in on envelope comparison plot. The difference between the sample times with a
particular amplitude on the envelope can be counted to reveal the delay. Half of the samples are not shown as
they occupy the top half of the envelope, and thus the result should be multiplied by 2.

PART 8: Sound Collage Using Filtered White Noise


A sound collage was created using only white noise as input. As a starting point, the filters that were
already designed in this assignment were used. This includes the filter titled lazer_wha, which was
documented in Part 1. A delay effect was applies to one copy of the lazer_wha file, and convolution
reverb was applied to all the filtered tracks, which are panned throughout the stereo field. Multiple
delayed copies of lazer wha where used, and as they are panned through the stereo field, comb filtering
effects occur.
There were two filters used that have not been documented yet. The first is the whawha filter in Audacity.
This filter gives a very low pitch wha, and almost has a sound resembling the low chest sound formant
in human speech. The following parameters were used for this filter:





LFO Freq = 1.5 Hz


Depth = 70%
Resonance = 2.5
Wha Frequency Offset = 30%

24

Tim Perry
V00213455
2009-05-21
The other new filter that was used is a 6 band parametric EQ (Figure 33). The center frequencies were
carefully chosen to add or remove the impression of proximity and listener envelopment. These gain of
these 6 center frequencies was automated to change through time by defining them as automation
parameters in Pro Tools. The gain was altered throughout the track.

Figure 32: Initial filtered noise files used for sound college.

25

Tim Perry
V00213455
2009-05-21

Figure 33: 6 Band parametric EQ with automated gain at center frequencies - applied to white noise to cause
proximity related frequencies to swell and wane as time progresses.

26

Tim Perry
V00213455
2009-05-21

REFERENCES
[1]

Udo Zlzer, DAFX. John Wiley & Sons, 2002.

APPENDIX A
PART 2 MATLAB Code
Convolution of Two Audio Files
%==========================================================================
% a5part7_Convolve.m
Tim Perry
% Elec484: DAFX
V00213455
% Assignment 3, Part 7
2009-05-21
%
% Convolve about 5 seconds of the Tom's Diner .wav sound file with
% a rhythmic pattern (made up from the given samples or your own sample),
% and describe the result.
% Repeat with the flute.wav sound file.
%==========================================================================
clear all;
close all;
% input audio files
wavfile1 = 'flute2.wav';
%wavfile1 = 'x1.wav';
wavfile2 = 'TransSiberian_Drums';
[x1, fs1, NBITS1] = wavread(wavfile1);
[x2, fs2, NBITS2] = wavread(wavfile2);
% Default to left channel for mono treatment of stereo input files
x1t = x1(:,1);
x2 = x2(:,1);
blockTime = 20e-3; %20 ms
blockLength = floor(blockTime*fs1);
blockNos = min( ceil( [length(x1) length(x2)]/blockLength ) );
y = zeros((blockLength*(blockNos+1)),1);
% Define window function
t = transpose(linspace(0,1,blockLength*2+1));
window = (1-cos(2*pi*t))/2;
% Perform convolution
for i = 0:blockNos-1
offset = 1 + i * blockLength;

27

Tim Perry
V00213455
2009-05-21
CurrentBL = min([blockLength length(x1)-offset length(x2)-offset]);
BlockConvolved = conv( x1(offset:offset+CurrentBL),
x2(offset:offset+CurrentBL));
BlockConvolved = window(1:length(BlockConvolved)).*BlockConvolved;
y(offset:offset+length(BlockConvolved)-1) =
y(offset:offset+length(BlockConvolved)-1) + BlockConvolved;
end
y = (1/(2.*max(y))).*y;

% lower amplitude to prevent wavwrite clipping

% name output file


file_out=strcat(wavfile1(1:length(wavfile1)-4),'Convolve');
% write output audio file
wavwrite(y, fs1, NBITS1, file_out);

PART 3 MATLAB Code


FIR Comb Filter Plots
%==========================================================================
% a3pt3_FIRcomb.m
Author: Tim Perry
% Elec484: DAFX
V00213455
% Assignment 3, Part 3
2009-05-21
%
% FIR comb filter (delay M=4) plots
%==========================================================================
clear all;
close all;
%
M
g
N

Filter Specs/Constants
= 4; % delay
= 0.9; % delay gain
= 1024; % FFT window size

% Filter coefficients
b = zeros(1,M+1);
b(1) = 1;
b(M+1) = g;
a = [1];
%------------------------------------------% Frequency Response
%------------------------------------------H_w = freqz(b,a,N);
w = linspace(0,pi,N);
figure(1)
% Magnitude response plot
subplot(2,1,1)
plot(w, abs(H_w));
grid on;

28

Tim Perry
V00213455
2009-05-21
axis([0 pi 0 2])
title('Magnitude Response of FIR Comb Filter')
xlabel('Normalized Frequency (radians/s)')
ylabel('|H(e^jw)|')
% Phase response plot
subplot(2,1,2)
plot(w, angle(H_w));
grid on;
axis([0 pi -pi pi])
title('Phase Response of FIR Comb Filter')
xlabel('Normalized Frequency (radians/s)')
ylabel('Arg(H(e^jw)) (radians)')
%------------------------------------------% Impulse Response
%------------------------------------------H_whole = freqz(b,a,N,'whole');
h = ifft(H_whole,N);
nSamples = linspace(0,N,N);
figure(2)
% Impulse response plot
stem(nSamples, h,'.','b-','MarkerSize',15);
grid on;
axis([-5 35 -0.2 1.2])
title('Impulse Response of FIR Comb Filter')
xlabel('n')
ylabel('h[n]')

IIR Comb Filter Plots


%==========================================================================
% a3pt3_FIRcomb.m
Author: Tim Perry
% Elec484: DAFX
V00213455
% Assignment 3, Part 3
2009-05-21
%
% IIR comb filter (delay M=4) plots
%==========================================================================
clear all;
close all;
%
M
g
c
N

Filter Specs/Constants
= 4;
% delay
= 0.8; % delay gain
= 1;
% input signal gain
= 1024; % FFT window size

% Filter coefficients
b = [c];
a = zeros(1,M+1);
a(1) = 1
a(M+1) = -g;

29

Tim Perry
V00213455
2009-05-21
%------------------------------------------% Frequency Response
%------------------------------------------H_w = freqz(b,a,N);
w = linspace(0,pi,N);
figure(1)
% Magnitude response plot
subplot(2,1,1)
plot(w, abs(H_w));
grid on;
axis([0 pi 0 max(H_w)+1])
title('Magnitude Response of IIR Comb Filter')
xlabel('Normalized Frequency (radians/s)')
ylabel('|H(e^jw)|')
% Phase response plot
subplot(2,1,2)
plot(w, angle(H_w));
grid on;
axis([0 pi -pi pi])
title('Phase Response of IIR Comb Filter')
xlabel('Normalized Frequency (radians/s)')
ylabel('Arg(H(e^jw)) (radians)')
%------------------------------------------% Impulse Response
%------------------------------------------H_whole = freqz(b,a,N,'whole');
h = ifft(H_whole,N);
nSamples = linspace(0,N,N);
figure(2)
% Impulse response plot
stem(nSamples, h,'.','b-','MarkerSize',15);
grid on;
axis([-5 60 -1 1.2])
title('Impulse Response of IIR Comb Filter')
xlabel('n')
ylabel('h[n]')

30

Tim Perry
V00213455
2009-05-21

PART 4 MATLAB Code


FIR Comb Filter Implementation
%==========================================================================
% a3pt4_FIRcomb.m
Author: Tim Perry
% Elec484: DAFX
V00213455
% Assignment 3, Part 4
2009-05-23
%
% Implements FIR comb filter with adjustable delay parameters.
% Input Audio: Tom's Diner.wav and the flute.wav sound sample
% See Table 3.4 on page 71 of DAFX for ideas.
%==========================================================================
clear all;
close all;
% Filter Specs/Constants
delayTime = 10;
% delay time in ms
g = 0.9;
% delay gain
N = 1024;
% FFT window size
% Input Audio
wavfile = 'flute2.wav';
% wavfile = 'diner.wav';
[audio_in, f_s, nbits] = wavread(wavfile);
numSamples = length(audio_in);
% Define delay M (samples)
M = (delayTime/1000)*f_s;
% Filter coefficients
b = zeros(1,M+1);
b(1) = 1;
b(M+1) = g;
a = [1];
%------------------------------------------% Apply filter to audio
%------------------------------------------y = filter(b,a,audio_in);
y = (1/(2.*max(y))).*y;
% lower amplitude to prevent wavwrite clipping
% name output file
delaylabel = int2str(delayTime);
file_out=strcat(wavfile(1:length(wavfile)-4),'FIRcomb-',delaylabel,'ms')
% write output audio file
wavwrite(y, f_s, nbits, file_out);
%------------------------------------------% Plot IR of output file
%------------------------------------------samples = linspace(0,numSamples,numSamples);

31

Tim Perry
V00213455
2009-05-21
figure(1)
% Impulse response plot
stem(samples, y,'.','b-','MarkerSize',15);
grid on;
axis([-5 numSamples -1 1])
title('FIR Comb Filter Output')
xlabel('n')
ylabel('h[n]')

IIR Comb Filter Implementation


%==========================================================================
% a3pt4_FIRcomb.m
Author: Tim Perry
% Elec484: DAFX
V00213455
% Assignment 3, Part 4
2009-05-23
%
% Implements IIR comb filter with adjustable delay parameters.
% Input Audio: Tom's Diner.wav and the flute.wav sound sample
% See Table 3.4 on page 71 of DAFX for some ideas.
%==========================================================================
clear all;
close all;
% Filter Specs/Constants
delayTime = 100;
% delay time in ms
g = 0.5;
% delay gain
c = 1;
% input signal gain
N = 1024;
% FFT window size
% Input Audio
% wavfile = 'flute2.wav';
wavfile = 'diner.wav';
[audio_in, f_s, nbits] = wavread(wavfile);
numSamples = length(audio_in);
% Define delay M (samples)
M = (delayTime/1000)*f_s;
% Filter coefficients
b = [c];
a = zeros(1,M+1);
a(1) = 1;
a(M+1) = -g;
%------------------------------------------% Apply filter to audio
%------------------------------------------y = filter(b,a,audio_in);
y = (1/(2.*max(y))).*y;
% lower amplitude to prevent wavwrite clipping
% name output file
delaylabel = int2str(delayTime);
file_out=strcat(wavfile(1:length(wavfile)-4),'IIRcomb-',delaylabel,'ms');

32

Tim Perry
V00213455
2009-05-21
% write output audio file
wavwrite(y, f_s, nbits, file_out);
%------------------------------------------% Plot IR of output file
%------------------------------------------samples = linspace(0,numSamples,numSamples);
figure(1)
% Impulse response plot
stem(samples, y,'.','b-','MarkerSize',11);
grid on;
axis([-5 numSamples -1 1])
title('IIR Comb Filter Output')
xlabel('n')
ylabel('h[n]')
wavplay(y, f_s);

PART 5 MATLAB Code


Vibrato.m [1]
function y=Vibrato(x,SAMPLERATE,Modfreq,Width)
ya_alt=0;
Delay=Width; % basic delay of input sample in sec
DELAY=round(Delay*SAMPLERATE); % basic delay in # samples
WIDTH=round(Width*SAMPLERATE); % modulation width in # samples
if WIDTH>DELAY
error(delay greater than basic delay !!!);
return;
end;
MODFREQ=Modfreq/SAMPLERATE; % modulation frequency in # samples
LEN=length(x); % # of samples in WAV-file
L=2+DELAY+WIDTH*2; % length of the entire delay
Delayline=zeros(L,1); % memory allocation for delay
y=zeros(size(x)); % memory allocation for output vector

for n=1:(LEN-1)
M=MODFREQ;
MOD=sin(M*2*pi*n);
ZEIGER=1+DELAY+WIDTH*MOD;
i=floor(ZEIGER);
frac=ZEIGER-i;
Delayline=[x(n);Delayline(1:L-1)];
%---Linear Interpolation----------------------------y(n,1)=Delayline(i+1)*frac+Delayline(i)*(1-frac);
%---Allpass Interpolation-----------------------------%y(n,1)=(Delayline(i+1)+(1-frac)*Delayline(i)-(1-frac)*ya_alt);
%ya_alt=ya(n,1);
End;

33

Tim Perry
V00213455
2009-05-21

Script for Running Vibrato [1]


%==========================================================================
% a5part7_Allpass.m
Tim Perry
% Elec484: DAFX
V00213455
% Assignment 3, Part 5
2009-05-23
%
% Add a vibrato effect to a steady pitched sound (single instrument melody)
% Algorithm provided by U. Zolzer in DAFX
%==========================================================================
clear all
close all
%define constants
f_s=44100;
f = 110;
vibwidth = 1.5e-3;
modfreq = 4;
duration = 5;
nbits = 16:
% input audio file
%wavfile = 'cello.wav';
% read input audio
%[x, f_s, NBITS] = wavread(wavfile);
%numSamples = length(wavfile);
n=[1:duration*f_s];
x=sin(2*pi*n*f/f_s);
y = vibrato(x', f_s, modfreq, vibwidth);
wavwrite(y, f_s, nbits, 'a3pt5_vibrato');

34

Tim Perry
V00213455
2009-05-21

PART 7 MATLAB Code


Allpass Filter Testing
%==========================================================================
% a5part7_Allpass.m
Author: Tim Perry
% Elec484: DAFX
V00213455
% Assignment 3, Part 7
2009-05-23
%
% Plot the group delay of the allpass filter designed in part 6.
% Verify that the group delay is the "time delay of the amplitude envelope
% of a sinusoid at a particular frequency" by testing with two suitable AM
% signals with carrier frequencies near the minimum and maximum group delay.
%==========================================================================
clear all;
close all;
hold on;
%-------------------------------------------------------------% Filter specifications and constants
%-------------------------------------------------------------f_s = 44100;
f=[0:1:f_s/2]; %freq range 0 to 4000 Hz (positive Nyquist band)
N = 1024; % FFT window size
w=2*pi*f/f_s;
z=exp(w*j);
%--------------------------------------% Filter coefficients from POI
%--------------------------------------K = 1.2344
a = [1.2343 -1.5712 1]
b = K*[0.8100 -1.2728 1]

%---------------------------------------------------------------% Frequency Response


%---------------------------------------------------------------f = linspace(0,f_s/2,N);
H_f = freqz(b,a,N);
%magnitude response
magH_f = abs(H_f);
argH_f = angle(H_f);
%phase response
%group delay
gd = grpdelay(b,a,f,f_s);
figure(1)
% Magnitude response plot
subplot(3,1,1)
plot(f, magH_f );
grid on;
axis([0 f_s/2 0 1.2])
title('Magnitude Response of Allpass Filter')
xlabel('Frequency (Hz)')
ylabel('|H(e^jw)|')
% Phase response plot
subplot(3,1,2)
plot(f, argH_f);
grid on;

35

Tim Perry
V00213455
2009-05-21
axis([0 f_s/2 -pi pi])
title('Phase Response of Allpass Filter')
xlabel('Frequency (Hz)')
ylabel('Arg(H(e^jw)) (radians)')
% Group delay plot
subplot(3,1,3)
plot(f, gd);
grid on;
axis([0 f_s/2 0 max(gd)*1.1])
title('Group Delay of Allpass Filter')
xlabel('Frequency (Hz)')
ylabel('Group Delay (samples)')

%---------------------------------------------------------------% Test Sinusiods


%---------------------------------------------------------------f1 = 5500; % cutoff frequency (where max group delay occurs)
f2 = 15000; % freq where group delay approches zero
n = linspace(0,N,N);
% AM signals
%message frequency
fm = 10;
Am = 0.1;
%message amplitude
x1 = (1 + Am*cos(2*pi*fm*n)).*sin(2*pi*f1*n);
x2 = (1 + Am*cos(2*pi*fm*n)).*sin(2*pi*f2*n);
%x1 = 0 + cos(2*pi*f1*n);
%x2 = 0 + cos(2*pi*f2*n);

% filter AM signals with allpass filter


y1 = filter(b,a,x1);
y2 = filter(b,a,x2);
figure(2)
% plot filtered AM signals to compare delay
subplot(2,1,1)
stem(n, y1,'.','b-','MarkerSize',13);
grid on;
axis([0 N min(x1)*1.1 max(x1)*1.1])
title('Allpass filter response to x1 = 1 + cos(2*pi*f1*n)')
xlabel('n')
ylabel('y_1[n]')
subplot(2,1,2)
stem(n, y2,'.','r-','MarkerSize',13);
grid on;
axis([0 N min(y1)*1.1 max(y1)*1.1])
title('Allpass filter response to x2 = 1 + cos(2*pi*f2*n)')
xlabel('n')
ylabel('y_1[n]')

36

Вам также может понравиться