Je fais une FFT sur un signal carré, 100Hz, amplitude 5V, rapport cyclique 50%

Nom : nH3sC.png
Affichages : 3536
Taille : 23,9 Ko

En toute logique la valeur moyenne (ou composante continue qui est à la fréquence 0Hz), d'un tel signal c'est simplement 2.5V puisque ce signal de 5V est haché de 50%. Mais dans l'image ci dessous, la valeur moyenne est bien trop grande.

Nom : SrhhD.png
Affichages : 3641
Taille : 8,4 Ko

Je tourne en rond depuis quelques jours car je ne comprends pas pourquoi j'ai une valeur moyenne (composante continue) aussi grande sur la courbe issue d'un calcul avec scipy.fftpack ? Est ce que je l'utilise mal ?


D'avance merci.
A+



Voici mon code. Nota : Pourtant la fondamentale est ok (à 100Hz elle fait 2.5V d'amplitude) ensuite on voit les harmoniques de rang impaire (300Hz, 500Hz, 700Hz, ...), typique d'un signal carré. Ce qui cloche c'est la composante continue


Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
from scipy.fftpack import fft
from scipy import signal
import matplotlib.pyplot as plt
import numpy as np
 
#
# configuration
# time analyse = L * (1/Fsample)
#
L = 512 # lenght buffer
Fsample = 2000 # frequency sample
Fsignal = 100 # frequency
 
#********************************
 
# perdiode sample
Tsample = 1.0/Fsample
 
# time vector, start = 0s, stop = 0.1024s, step = (0.1024s / (1/Fe))
t = np.linspace(0.0, L*Tsample, L)
 
# signal definition, DC offet = 2.5V, Amplitude = 2.5V
signal = 2.5 + 2.5*signal.square(2 * np.pi * Fsignal * t, 0.5)
 
# plot time signal
plt.subplot(2,1,1)
plt.plot(t, signal)
 
# fft of time signal
yf = fft(signal)
 
# time vector of fft 
xf = np.linspace(0.0, 1.0/(2.0*Tsample), L//2)
 
# plot spectral
plt.subplot(2,1,2)
plt.plot(xf, 2.0/L * np.abs(yf[0:L//2]))