<< Chapter < Page | Chapter >> Page > |
Try looking at the frequency content of a few other signals. Note that the fall signal happens to have an even length, so N/2 is an integer. If the length is odd, you may have indexing problems, so it is easiest to just omit the last sample, as in
x=x(1:length(x)-1);
.
After you make modifications of a signal in the frequency domain, you typically want to get back to the time domain. The MATLAB command
ifft
will accomplish this task.
>>xnew = real(ifft(X));
You need the
real
command because the inverse Fourier transform returns a vector that is complex-valued, since some changes that you make in the frequence domain could result in that. If your changes maintain complex symmetry in the frequency domain, then the imaginary components should be zero (or very close), but you still need to get rid of them if you want to use the
sound
command to listen to your signal.
An ideal low-pass filter eliminates high frequency components entirely, as in: A real low-pass filter typically has low but non-zero values for at high frequencies, and a gradual (rather than an immediate) drop in magnitude as frequency increases. The simplest (and least effective) low-pass filter is given by (e.g. using an RC circuit):
This low-pass filter can be implemented in MATLAB using what we know about the Fourier transform. Remember that multiplication in the Frequency domain equals convolution in the time domain. If our signal and filter are both in the frequency domain, we can simply multiply them to produce the result of the system.
Below is an example of using MATLAB to perform low-pass filtering on the input signal
x
with the FFT and the filter definition above.
The cutoff of the low-pass filter is defined by the constant
a
. The low-pass filter equation above defines the filter
H
in the frequency domain. Because the definition assumes the filter is centered around w = 0, the vector
w
is defined as such.
>>load fall %load in the signal>>x = fall;>>X = fft(x); % get the Fourier transform (uncentered)>>N = length(X);>>a = 100*2*pi;>>w = (-N/2+1:(N/2))*Fs/N*2*pi; % centered frequency vector (rad/s)>>H = a ./ (a + i*w); % generate centered sampling of H>>plot(w/(2*pi),abs(H)) % w converted back to Hz for plotting
The plot will show the form of the frequency response of a system that we are used to looking at, but we need to shift it to match the form that the
fft
gave us for x.
>>Hshift = fftshift(H); % uncentered version of H>>Y = X .* Hshift'; % filter the signal
'
operator transposes vectors/matrices in MATLAB.>>y = real(ifft(Y));>>sound(x, Fs) % original sound>>sound(y, Fs) % low-pass-filtered sound
The filter reduced the signal amplitude, which you can hear when you use the
sound
command but not with the
soundsc
which does automatic scaling. Replay the sounds with the
soundsc
and see what other differences there are in the filtered vs. original signals. What changes could you make to the filter to make a greater difference?
>>y = y * (max(abs(x))/max(abs(y)))
Notification Switch
Would you like to follow the 'Continuous time linear systems laboratory (ee 235)' conversation and receive update notifications?