Catégories
Algorithme Arduino Matlab Traitement du signal sur matlab

Analyse fréquentielle #2: Simulation de la DFT (Transformée de Fourier Discrète)

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.

formule transformée de fourrier descrete

Analyse fréquentielle - Signal temporel

%% 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)

Analyse fréquentielle - Signal fréquentiel

%% 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.

Laisser un commentaire