Advertisement
Guest User

Untitled

a guest
Jan 22nd, 2019
150
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.57 KB | None | 0 0
  1. #! /usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3.  
  4. import numpy as np
  5. import pyaudio
  6.  
  7. if __name__ == "__main__":
  8.  
  9.     FSAMP = 22050        # czestotliwosc probkowania w Hz
  10.     ROZMIAR_PROB = 2048  # ilosc probek
  11.     KLATEK_NA_FFT = 16   # ilosc klatek zajmujacych srednio przez szybka transformate fouriera
  12.     NOTKA_MIN = 40       # E2
  13.     NOTKA_MAX = 64       # E4
  14.  
  15. # dla wyswietlenia nazw dzwieku
  16.  
  17.     NOTACJA = 'E F F# G G# A A# B C C# D D#'.split()
  18.  
  19. # nowe dzwieki
  20.  
  21.     PROBKI_NA_FFT = ROZMIAR_PROB * KLATEK_NA_FFT
  22.     KROK_CZESTOTLIWOSCI = float(FSAMP) / PROBKI_NA_FFT
  23.  
  24.  
  25. def nazwa_notki(n):
  26.     return NOTACJA[n % NOTKA_MIN % len(NOTACJA)] + str(int(n / 12 - 1))
  27.  
  28.  
  29. def czestotliwosc_na_numer(f):
  30.     return 64 + 12 * np.log2(f / 329.63)
  31.  
  32.  
  33. def numer_na_czestotliwosc(n):
  34.     return 329.63 * 2.0**((n - 64) / 12.0)
  35.  
  36.  
  37. # pobranie minumalnego\maksymalnego nr indeksu z szybkiej transformaty fouriera
  38. # widocznosc dokumentacji dla numpy.rfftfreq()
  39.  
  40.  
  41. def notka_do_fftbin(n):
  42.     return numer_na_czestotliwosc(n) / KROK_CZESTOTLIWOSCI
  43.  
  44.  
  45. imin = max(0, int(np.floor(notka_do_fftbin(NOTKA_MIN - 1))))
  46. imax = min(PROBKI_NA_FFT, int(np.ceil(notka_do_fftbin(NOTKA_MAX + 1))))
  47.  
  48. # Przydzial przestrzeni aby uruchomic szybka transformate fouriera
  49. buf = np.zeros(PROBKI_NA_FFT, dtype=np.float32)
  50. numer_klatki = 0
  51.  
  52. # inicjalizacja dzwieku
  53. stream = pyaudio.PyAudio().open(format=pyaudio.paInt16, channels=1, rate=FSAMP, input=True, frames_per_buffer=ROZMIAR_PROB)
  54. stream.start_stream()
  55.  
  56. # tworzenie funkcji Hanninga
  57. window = 0.5 * (1 - np.cos(np.linspace(0, 2 * np.pi, PROBKI_NA_FFT, False)))
  58.  
  59. # wypisanie poczatkowego tekstu
  60. print('pobieranie probek w:', FSAMP, 'Hz z maksymalna rozdzielczoscia', KROK_CZESTOTLIWOSCI, 'Hz')
  61.  
  62. # otrzymywane dane w czasie:
  63. while stream.is_active():
  64.  
  65.     # przesuwanie bufora i wprowadzenie nowych danych
  66.     buf[:-ROZMIAR_PROB] = buf[ROZMIAR_PROB:]
  67.     buf[-ROZMIAR_PROB:] = np.fromstring(stream.read(ROZMIAR_PROB), np.int16)
  68.  
  69.     # Uruchom szybka transformate fouriera na okiennym buforze
  70.     fft = np.fft.rfft(buf * window)
  71.  
  72.     # pobierz czestotliwosc maksymalnej wartosci z zakresu
  73.     czestotliwosc = (np.abs(fft[imin:imax]).argmax() + imin) * KROK_CZESTOTLIWOSCI
  74.  
  75.     # pobierz numer notatki i najblizsza notatke
  76.     n = czestotliwosc_na_numer(czestotliwosc)
  77.     n0 = int(round(n))
  78.  
  79.     # dane wyjsciowe konsoli, gdy mamy pelny bufor
  80.     numer_klatki += 1
  81.  
  82.     if numer_klatki >= KLATEK_NA_FFT:
  83.         print('Numer {:7.2f}     Wysokosc: {:7.2f} Hz     Nota: {:>3s} {:+.2f}'.format(n, czestotliwosc, nazwa_notki(n0), n - n0))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement