Objectifs
- Savoir implémenter la DFT avec Matlab
- Savoir exploiter le spectre d’un signal avec Matlab
- Savoir extraire les amplitudes de la DFT
- Comprendre la notion de la fréquence
- Savoir la relation entre la fréquence et la longueur d’onde
- Savoir définir la fréquence d’échantillonnage
- Savoir la formule de la transformée de Fourier discrète (DFT)
- Comprendre la notion du spectre
- Etc.
Voir le tuto pour plus de détails
Analyse temporelle du signal (Code Matlab)
L’implémentation de la DFT (Digital Fourier Transform) consiste à implémenter l’équation ci-dessous.
%% Signal temporel
N=2^12;
f0=1;t0=1/f0;
t=linspace(0,5*t0,N);
ts=t(2)-t(1); fs=1/ts;
s_0=1; % DC
s_1=2*sin(2*pi*f0*t); % f0
s_2=4*sin(2*pi*3*f0*t); % 3f0
s_3=6*sin(2*pi*7*f0*t); % 7f0
s_b=0*randn(1,N); % Bruit/Normal
s_t=s_0+s_1+s_2+s_3+s_b; % Signal
% Affichage
figure(1);
subplot(211);
plot(t,s_1,'r-o','LineWidth',2); hold on; grid on;
plot(t,s_2,'m-o','LineWidth',2);
plot(t,s_3,'k-o','LineWidth',2);
xlabel('Temps(s)','fontsize',13);
xlim([0 2*t0]);
ylabel('Amplitude(V)','fontsize',13);
legend({'s_1(t), f_0','s_2(t), 3f_0','s_3(t), 7f_0'},'fontsize',13);
set(gca,'color','none');
subplot(212);
plot(t,s_t,'b','LineWidth',3); hold on; grid on;
xlabel('Temps(s)','fontsize',13);
xlim([0 2*t0]);
ylabel('Amplitude(V)','fontsize',13);
legend({'s(t)'},'fontsize',13);
set(gca,'color','none');
Analyse fréquentielle d’un signal (Code Matlab)
%% Init
clear all;
close all;
clc;
%% Signal temporel
N=2^12;
f0=1;t0=1/f0;
t=linspace(0,5*t0,N);
ts=t(2)-t(1); fs=1/ts;
s_0=1; % DC
s_1=2*sin(2*pi*f0*t); % f0
s_2=4*sin(2*pi*3*f0*t); % 3f0
s_3=6*sin(2*pi*7*f0*t); % 7f0
s_b=0*randn(1,N); % Bruit/Normal
s_t=s_0+s_1+s_2+s_3+s_b; % Signal
% Affichage
figure(1);
subplot(211);
plot(t,s_1,'r-o','LineWidth',2); hold on; grid on;
plot(t,s_2,'m-o','LineWidth',2);
plot(t,s_3,'k-o','LineWidth',2);
xlabel('Temps(s)','fontsize',13);
xlim([0 2*t0]);
ylabel('Amplitude(V)','fontsize',13);
legend({'s_1(t), f_0','s_2(t), 3f_0','s_3(t), 7f_0'},'fontsize',13);
set(gca,'color','none');
subplot(212);
plot(t,s_t,'b','LineWidth',3); hold on; grid on;
xlabel('Temps(s)','fontsize',13);
xlim([0 2*t0]);
ylabel('Amplitude(V)','fontsize',13);
legend({'s(t)'},'fontsize',13);
set(gca,'color','none');
%% Spectre fréquentiel
% Calcul de la DFT (Manuelle)
nfft=floor(N);
df=fs/nfft;
f=linspace(-fs/2-df,fs/2,nfft);%
s_f=zeros(1,nfft);
for k=0:nfft-1
somme=0.0;
for j=0:N-1
somme=somme+(s_t(j+1)*exp(-1i*2*pi*k*j/N));
end
s_f(k+1)= somme;
end
% Calcul de la DFT (Matlab)
s_fm=fft(s_t,nfft);
% Affichage
figure(2);
subplot(211);
plot(f,fftshift(abs(s_f)),'r-o','LineWidth',3); hold on; grid on;
plot(f,fftshift(abs(s_fm)),'b-','LineWidth',3);
xlabel('Fréquence(Hz)','fontsize',13);
% xlim([f(1) f(end)]);
xlim([-10*f0, 10*f0]);
ylabel('||FFT||(V)','fontsize',13);
legend({'FFT Manuelle','FFT Matlab'},'fontsize',13);
set(gca,'color','none');
subplot(212);
plot(f,fftshift((abs(s_f))/(N)),'r-o','LineWidth',3); hold on; grid on;
plot(f,fftshift((abs(s_fm))/(N)),'b-','LineWidth',3);
xlabel('Fréquence(Hz)','fontsize',13);
% xlim([f(1) f(end)]);
xlim([-10*f0, 10*f0]);
ylabel('||FFT||/(N/2)(V)','fontsize',13);
legend({'FFT Manuelle','FFT Matlab'},'fontsize',13);
set(gca,'color','none');
On verra dans le prochain tuto l’implémentation en C sur Arduino et le test de la DFT.