Projet Raspberry Pi analyse fréquentielle des vibrations

diablack -  
 diablack -
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

2 réponses

  1. Phil_1857 Messages postés 1883 Date d'inscription   Statut Membre Dernière intervention   169
     
    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
  2. diablack
     
    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