DFT linearity - "melodic" tones spectrum problem
1 view (last 30 days)
Show older comments
Hello,
My question is simple:
When I take the FFT of the signal consisting of three subsequent sinusoidal tones should I get the same resulting spectrum as when I take spectra of each tone separately and sum them up?
My script below suggest that this might not be true. Why?
With regards, Micholeodon
%%"MELODIC" vs "HARMONIC" tones analysis
clear;
close all;
clc;
% prepare custom signal: contains threee harmonics: f1 f2 f3 Hz. Each
% harmonic lasts for t_dur s. Harmonics onsets at: t1, t2, t3.
f1 = 2;
f2 = 10;
f3 = 20;
t1 = 0;
t2 = 1;
t3 = 2;
a1 = 1;
a2 = 1;
a3 = 1;
t_dur = 1;
srate = 500;
t_i = 0;
t_e = t_i + 3*t_dur - 1/srate; % nescessary to delete last sample in order to srate/length(timeline) be integer
timeline = t_i:(1/srate):t_e;
n = @(x) (x-t_i)*srate + 1; % function to get sample number from time
s1 = a1*sin(2*pi*f1*timeline);
s1(n(t_i):n(t1)) = 0;
s1(n(t1 + t_dur):n(t_e)) = 0;
s2 = a2*sin(2*pi*f2*timeline);
s2(n(t_i):n(t2)) = 0;
s2(n(t2 + t_dur):n(t_e)) = 0;
s3 = a3*sin(2*pi*f3*timeline);
s3(n(t_i):n(t3)) = 0;
s3(n(t3 + t_dur):n(t_e)) = 0;
sig_mel = s1 + s2 + s3;
h1 = a1*sin(2*pi*f1*timeline);
h2 = a2*sin(2*pi*f2*timeline);
h3 = a3*sin(2*pi*f3*timeline);
sig_harm = h1 + h2 + h3;
X_mel = fft(sig_mel);
X_mel_mag = abs(X_mel);
X_harm = fft(sig_harm);
X_harm_mag = abs(X_harm);
m = 0:length(timeline)-1;
figure(1)
subplot(4,1,1)
plot(timeline, sig_mel)
title('tones in sequence')
subplot(4,1,2)
plot(timeline, sig_harm)
title('tones harmonicly')
subplot(4,1,3)
plot(m, X_mel_mag)
title('DFT of sequenced tones')
subplot(4,1,4)
plot(m, X_harm_mag)
title('DFT of harmonic tones')
% check linearity of the spectrum: analyse each tone separately, obtain
% their spectra and sum them together and finally compare with melodic
% signal spectrum.
figure(2)
subplot(3,1,1)
plot(timeline,s1)
title('first tone')
subplot(3,1,2)
plot(timeline,s2)
title('second tone')
subplot(3,1,3)
plot(timeline,s3)
title('third tone')
figure(3)
s1_dft = fft(s1);
s2_dft = fft(s2);
s3_dft = fft(s3);
subplot(4,1,1)
plot(m,abs(s1_dft))
title('first tone DFT')
subplot(4,1,2)
plot(m,abs(s2_dft))
title('second tone DFT')
subplot(4,1,3)
plot(m,abs(s3_dft))
title('third tone DFT')
subplot(4,1,4)
sum_dft = abs(s1_dft)+abs(s2_dft)+abs(s3_dft);
plot(m,sum_dft)
title('sum of DFTs')
% compasrison
figure(4)
subplot(3,1,1)
plot(m, X_mel_mag)
title('DFT of sequenced tones')
subplot(3,1,2)
plot(m,sum_dft)
title('sum of DFTs')
subplot(3,1,3)
plot(m, X_mel_mag - sum_dft)
title('Difference')
0 Comments
Accepted Answer
Honglei Chen
on 17 Jan 2017
You need to define the sum_dft as
sum_dft = s1_dft+s2_dft+s3_dft;
instead and then plot and compare using abs(sum_dft). Otherwise you are not doing a fair comparison as you throwing away all the phase information.
HTH
More Answers (0)
See Also
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!