2017-01-08 8 views
1
#!/usr/bin/env python 

from __future__ import print_function 

import sys 
import time 
import getopt 
import alsaaudio 
import numpy 
from time import sleep 


    class A_weight(): 

     def __init__(self): 
      skaler = 2.361E-14 
      fix_cur = 0.20565360419770495 
      A = [] 
      hPa = 4e-11 
      card = 'default' 
      array_float = numpy.dtype(float) 
      stream = alsaaudio.PCM(alsaaudio.PCM_CAPTURE, alsaaudio.PCM_NORMAL, card) 
      stream.setchannels(1) 
      stream.setrate(48000) 
      stream.setformat(alsaaudio.PCM_FORMAT_S16_LE) 
      stream.setperiodsize(128) 

     def A(f): 
      return (12200**2*f**4/((f**2+20.6**2)*(f**2+12200**2)*numpy.sqrt(f**2+107.7**2)*numpy.sqrt(f**2+737.9**2)))+fix_cur 

     def listen(self): 
      glob_leq = 0 
      liczba_ramek = 0 
      index_ramek = 0 
      while True: 
       try: 
        l, data = stream.read() 
       except IOError, e: 
        error_count += 1 
        print(" (%d) Error recording: %s" % (error_count, e)) 
       else: 
        if l==128: 
         decoded_block = numpy.frombuffer(data, dtype='int16') 
        else: 
        continue 
       Y = numpy.fft.fft(decoded_block) # fft computing and normalization 
       Aw = A(numpy.arange(20.,20000,(19980./len(Y)))) 
       Na = Aw*Y 
       inverse = numpy.fft.ifft(Y) 
       maks = 32768 
       array_float = numpy.divide(inverse.real ,float(maks)) 
       array_float = array_float**2 
       sum_array = numpy.sum(array_float, dtype=float) 
       glob_leq = glob_leq + sum_array 
       liczba_ramek += 1 
       index_ramek += 1 
       if index_ramek == 375: 
        index_ramek=0 
        cis_chwil = numpy.divide(glob_leq, liczba_ramek * 128) 
        leq =10*numpy.log10(numpy.divide(cis_chwil, hPa)) 
        print (leq) 
        #A.append(leq) 
        #print(max(A)) 
A_weight().listen() 

So i Druckpegel versucht, Schreibprogramm Rechen Sound-Klasse in anderen Klasse Python Import mit Gewichtung A. Alle Arbeiten richtig, aber wenn ich schließen möchte in der Klasse Code kann ich habe ein Problem. Da in diesem Fall etwas falsch mit dem Import der Klasse ist, ist es alsaaudio. bekomme ich dieses Feedback:Wie rufe ich kann

Traceback (most recent call last): 
File "rec_A.py", line 64, in <module> 
A_weight().listen() 
File "rec_A.py", line 37, in listen 
l, data = stream.read() 
NameError: global name 'stream' is not defined 

Haben Sie eine Idee haben

+2

'' stream'' ist derzeit eine lokale Variable in '' __init __() '' - es nirgendwo anders zugegriffen werden kann. Sie müssen stattdessen '' self.stream'' verwenden, um daraus eine Instanzvariable zu machen, auf die von anderen Methoden der Klasse zugegriffen werden kann. – jasonharper

Antwort

0

Ändern jedes Vorkommen von stream-self.stream:

class A_weight(): 

    def __init__(self): 
     skaler = 2.361E-14 
     fix_cur = 0.20565360419770495 
     A = [] 
     hPa = 4e-11 
     card = 'default' 
     array_float = numpy.dtype(float) 
     self.stream = alsaaudio.PCM(alsaaudio.PCM_CAPTURE, alsaaudio.PCM_NORMAL, card) 
     self.stream.setchannels(1) 
     self.stream.setrate(48000) 
     self.stream.setformat(alsaaudio.PCM_FORMAT_S16_LE) 
     self.stream.setperiodsize(128) 

    ... 

    def listen(self): 
     glob_leq = 0 
     liczba_ramek = 0 
     index_ramek = 0 
     while True: 
      try: 
       l, data = self.stream.read() 

    ... 

Dies wird es eine Instanzvariable machen, und alle anderen Maßnahmen zur Diese Klasse (solange sie das self Argument übergeben werden) wird über Zugriff auf es haben. Weitere Details zu Instanzvariablen finden Sie unter this bit of documentation. Dies ist auch nur ein ästhetischer Punkt, aber die Konvention in Python ist die Verwendung von camel case für Klassennamen, d. H. AWeight anstelle von A_weight - dies hat jedoch keinen Einfluss auf die Ausführung Ihres Codes.

+0

Danke für Ihren Rat. Alles funktioniert sehr gut :) – Bednar

+0

@Bednar super! Vergessen Sie nicht zu akzeptieren und/oder upvote die Antwort, wenn es Ihr Problem gelöst;) – elethan

+0

:) Ja, ich weiß, aber ich kann nicht wählen, weil mein Ruf ist weniger als 15. – Bednar

Verwandte Themen