Projet Raspberry Pi analyse fréquentielle des vibrations

Fermé
diablack - 22 juin 2021 à 14:20
 diablack - 22 juin 2021 à 17:07
Bonjour,

J'ai un projet à réaliser, je dois avec un raspberry pi et quelques composants comme un micro de contact, un convertisseur analogique numérique... Le problème est que mon code ne fonctionne pas très bien. Le graphique est généré et s'affiche, mais je crois qu'il ne récupère pas bien les données du microphone de contact alors que le branchement est correct.
Pouvez-vous m'aider et m'indiquer ce qui ne va pas dans mon code :
from __future__ import division

import numpy as np

import pylab as pl

import random

import Adafruit_ADS1x15

# # Créez une instance ADS1015 ADC (12 bits).
adc = Adafruit_ADS1x15.ADS1015()

GAIN = 1

adc.start_adc(0, gain=GAIN)

t = np.array([])

for i in range(20):

t = np.append(t, [adc.get_last_result(), ])



LW = 2 #Largeur de la ligne

AC = 0.5 #cannal alpha

pi = np.pi



def periodogramSS(inputsignal,fsamp):

N = len(inputsignal)

N_notnan = np.count_nonzero(~np.isnan(inputsignal))

hr = fsamp/N #Résolution de fréquence

#flow,fhih = -fsamp/2,(fsamp/2)+hr #spectre a deux côtés

flow,fhih = 0,fsamp/2+hr #Spectre à un côté

#flow,fhih = hr,fsamp/2

frange = np.arange(flow,fhih,hr)

fN = len(frange)

Aspec = np.zeros(fN)

n = 0

for f in frange:

Aspec[n] = np.abs(np.nansum(inputsignal*np.exp(-2j*pi*f*t)))/N_notnan

n+=1

Aspec *= 2 #single-sided spectrum

Aspec[0] /= 2 #Composant DC divisé par 2 (i.e. halved)

return (frange,Aspec)



#construire signal de référence:

f1 = 10 #Hz

T = 1/f1

fs = 10*f1

Ts = 1/fs

t = np.arange(0,20*T,Ts)

DC = 3.0

x = DC + 1.5*np.cos(2*pi*f1*t)



#supprimer les valeurs du signal x aléatoirement:

ndel = 10 #nombre d'échantillons à remplacer avec NaN

random.seed(0)

L = len(x)

randidx = random.sample(range(0,L),ndel)

for idx in randidx:

x[idx] = np.nan



(fax,Aspectrum) = periodogramSS(x,fs)



fig1 = pl.figure(1,figsize=(6*3.13,4*3.13)) #plein écran

pl.ion()



pl.subplot(211)

pl.plot(t, x, 'b.-', lw=LW, ms=2, label='ref', alpha=AC)



#marquer les valeurs NaN

for (t_,x_) in zip(t,x):

if np.isnan(x_):

pl.axvline(x=t_,color='g',alpha=AC,ls='-',lw=2)



pl.grid()

pl.xlabel('Time [s]')

pl.ylabel('Reference signal')



pl.subplot(212)

pl.stem(fax, Aspectrum, basefmt=' ', markerfmt='r.', linefmt='r-')

pl.grid()

pl.xlabel('Frequency [Hz]')

pl.ylabel('Amplitude spectrum')



fig1name = './signal2.png'

print ('Saving Fig. 1 to:'), fig1name

fig1.savefig(fig1name)


Configuration: Linux / Chrome 72.0.3626.121
A voir également:

2 réponses

Phil_1857 Messages postés 1883 Date d'inscription lundi 23 mars 2020 Statut Membre Dernière intervention 28 février 2024 178
22 juin 2021 à 17:05
Bonjour,

L'indentation étant importante en Python, merci de copier/coller ici ton code complet avec les balises de code
mode d'emploi:
https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code

Visuellement, ça doit ressembler à ceci (avec la coloration syntaxique) :

def test():
    print('test')

test()
0
from __future__ import division
 
import numpy as np
 
import pylab as pl
 
import random
 
import Adafruit_ADS1x15
 
# # Créez une instance ADS1015 ADC (12 bits).
adc = Adafruit_ADS1x15.ADS1015()
 
GAIN = 1
 
adc.start_adc(0, gain=GAIN)
 
t = np.array([])
 
for i in range(20):
 
 t = np.append(t, [adc.get_last_result(), ])
 
 
 
LW = 2 #Largeur de la ligne
 
AC = 0.5 #cannal alpha
 
pi = np.pi
 
 
 
def periodogramSS(inputsignal,fsamp):
 
 N = len(inputsignal)
 
 N_notnan = np.count_nonzero(~np.isnan(inputsignal))
 
 hr = fsamp/N #Résolution de fréquence
 
 #flow,fhih = -fsamp/2,(fsamp/2)+hr #spectre a deux côtés
 
 flow,fhih = 0,fsamp/2+hr #Spectre à un côté
 
 #flow,fhih = hr,fsamp/2
 
 frange = np.arange(flow,fhih,hr)
 
 fN = len(frange)
 
 Aspec = np.zeros(fN)
 
 n = 0
 
 for f in frange:
 
  Aspec[n] = np.abs(np.nansum(inputsignal*np.exp(-2j*pi*f*t)))/N_notnan
 
  n+=1
 
 Aspec *= 2 #single-sided spectrum
 
 Aspec[0] /= 2 #Composant DC divisé par 2 (i.e. halved)
 
 return (frange,Aspec)
 
 
 
#construire signal de référence:
 
f1 = 10 #Hz
 
T = 1/f1
 
fs = 10*f1
 
Ts = 1/fs
 
t = np.arange(0,20*T,Ts)
 
DC = 3.0
 
x = DC + 1.5*np.cos(2*pi*f1*t)
 
 
 
#supprimer les valeurs du signal x aléatoirement:
 
ndel = 10 #nombre d'échantillons à remplacer avec NaN
 
random.seed(0)
 
L = len(x)
 
randidx = random.sample(range(0,L),ndel)
 
for idx in randidx:
 
 x[idx] = np.nan
 
 
 
(fax,Aspectrum) = periodogramSS(x,fs)
 
 
 
fig1 = pl.figure(1,figsize=(6*3.13,4*3.13)) #plein écran
 
pl.ion()
 
 
 
pl.subplot(211)
 
pl.plot(t, x, 'b.-', lw=LW, ms=2, label='ref', alpha=AC)
 
 
 
#marquer les valeurs NaN
 
for (t_,x_) in zip(t,x):
 
 if np.isnan(x_):
 
  pl.axvline(x=t_,color='g',alpha=AC,ls='-',lw=2)
 
 
 
pl.grid()
 
pl.xlabel('Time [s]')
 
pl.ylabel('Reference signal')
 
 
 
pl.subplot(212)
 
pl.stem(fax, Aspectrum, basefmt=' ', markerfmt='r.', linefmt='r-')
 
pl.grid()
 
pl.xlabel('Frequency [Hz]')
 
pl.ylabel('Amplitude spectrum')
 
 
 
fig1name = './signal2.png'
 
print ('Saving Fig. 1 to:'), fig1name
 
fig1.savefig(fig1name)
0