Next: Waves Up: Lectures Previous: Vibrating Systems

## Discrete-Time/Frequency Analysis

### Motivation

• A simple sinusoidal signal, such as , is easily recognized in the time-domain.

• A complex waveform like that of Fig. 9, however, is less clear. Transforming a time-domain signal into its corresponding frequency-domain representation often helps to make apparent important characteristics of that signal.

### Discrete-Time Signals

• Because we are using computers to analyze sounds, we must be concerned with discrete-time, finite duration signals.
• By Shannon's sampling theorem and the Nyquist rate:

### The Discrete Fourier Transform (DFT)

• The DFT is efficiently implemented using the Fast Fourier Transform (FFT).

### The Inverse Discrete Fourier Transform (IDFT)

• The DFT and IDFT are lossless transformations ... no data or information is lost in transforming back and forth between the two representations.

### Matlab Examples

• To create a simple sinusoidal signal:

fs = 22050;                    % sampling rate
T = 1/fs;                      % sampling period
t = [0:T:0.25];                % time vector

f1 = 50;                       % frequency #1
omega1 = 2*pi*f1;              % angular frequency #1

phi = 2*pi*0.75;               % arbitrary phase offset = 3/4 cycle
x1 = cos(omega1*t + phi);      % sinusoidal signal, amplitude = 1

plot(t,x1);
xlabel('Time (seconds)');
ylabel('x1');


• To calculate and view the FFT of the simple sinusoid:

X1 = fft(x1);                  % FFT of x1
N = length(t);                 % N = length of fft
f = [0:N-1]*fs/(N-1);          % frequency vector

plot(f,abs(X1));               % plot magnitude
xlabel('Frequency (Hertz)');
ylabel('X1');
axis([0,fs/2,0,max(abs(X1))]); % display only frequencies < fs/2


• To create a more complex signal (using sinusoids):

phi = 2*pi*0.25;               % 1/4 cycle phase offset
x1 = cos(omega1*t + phi);      % sinusoidal signal, amplitude = 1
x2 = cos(2*pi*150*t + phi)/3;  % sinusoidal signal, amplitude = 1/3
x3 = cos(2*pi*250*t + phi)/5;  % sinusoidal signal, amplitude = 1/5
x4 = cos(2*pi*350*t + phi)/7;  % sinusoidal signal, amplitude = 1/7
x5 = cos(2*pi*450*t + phi)/9;  % sinusoidal signal, amplitude = 1/9

xcomplex = x1+x2+x3+x4+x5;

plot(t,xcomplex);
xlabel('Time (seconds)');
ylabel('xcomplex');


• To calculate and view the FFT of the complex signal:

Xcomplex = fft(xcomplex);      % FFT of xcomplex
plot(f,abs(Xcomplex));
xlabel('Frequency (Hertz)');
ylabel('Xcomplex');
axis([0,1000,0,max(abs(Xcomplex))]);


• Window xcomplex before doing FFT:

Xcompwin = fft(xcomplex.*hanning(N).');
plot(f,abs(Xcompwin));
xlabel('Frequency (Hertz)');
ylabel('Windowed Xcomplex');
axis([0,1000,0,max(abs(Xcompwin))]);


• Zero-pad xcomplex before doing FFT:

Xcompzp = fft([xcomplex,zeros(1,N)]);
fzp = [0:2*N-1]*fs/(2*N-1);
plot(fzp,abs(Xcompzp));
xlabel('Frequency (Hertz)');

• The application snd'' will be a useful tool for viewing time-varying spectra.