Advertisement
Guest User

Untitled

a guest
Jan 24th, 2019
170
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.64 KB | None | 0 0
  1. #! /usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. import fig as fig
  4. import numpy as np
  5. import pyaudio
  6. from matplotlib import pyplot as plt
  7. from matplotlib import animation
  8. from tkinter import *
  9. from tkinter import scrolledtext
  10.  
  11. if __name__ == "__main__":
  12.  
  13.     window = Tk()
  14.     window.title("Tuner")
  15.     window.geometry('1024x768')
  16.     txt = scrolledtext.ScrolledText(window, width=50, height=48)
  17.     txt.grid(column=0, row=0)
  18.     window.mainloop()
  19.  
  20.  
  21.     FSAMP = 22050        # czestotliwosc probkowania w Hz
  22.     ROZMIAR_PROB = 2048  # ilosc probek
  23.     KLATEK_NA_FFT = 16   # ilosc klatek zajmujacych srednio przez szybka transformate fouriera
  24.     NOTKA_MIN = 40       # E2
  25.     NOTKA_MAX = 64       # E4
  26.  
  27. # dla wyswietlenia nazw dzwieku
  28.  
  29.     NOTACJA = 'E F F# G G# A A# B C C# D D#'.split()
  30.  
  31. # nowe dzwieki
  32. PROBKI_NA_FFT = ROZMIAR_PROB * KLATEK_NA_FFT
  33. KROK_CZESTOTLIWOSCI = float(FSAMP) / PROBKI_NA_FFT
  34.  
  35.  
  36. def nazwa_notki(n):
  37.     return NOTACJA[n % NOTKA_MIN % len(NOTACJA)] + str(int(n / 12 - 1))
  38.  
  39.  
  40. def czestotliwosc_na_numer(f):
  41.     return 64 + 12 * np.log2(f / 329.63)
  42.  
  43.  
  44. def numer_na_czestotliwosc(n):
  45.     return 329.63 * 2.0**((n - 64) / 12.0)
  46.  
  47.  
  48. # pobranie minumalnego\maksymalnego nr indeksu z szybkiej transformaty fouriera
  49. # widocznosc dokumentacji dla numpy.rfftfreq()
  50.  
  51.  
  52. def notka_do_fftbin(n):
  53.     return numer_na_czestotliwosc(n) / KROK_CZESTOTLIWOSCI
  54.  
  55.  
  56. imin = max(0, int(np.floor(notka_do_fftbin(NOTKA_MIN - 1))))
  57. imax = min(PROBKI_NA_FFT, int(np.ceil(notka_do_fftbin(NOTKA_MAX + 1))))
  58.  
  59. # Przydzial przestrzeni aby uruchomic szybka transformate fouriera
  60. buf = np.zeros(PROBKI_NA_FFT, dtype=np.float32)
  61. numer_klatki = 0
  62.  
  63. # inicjalizacja dzwieku
  64. stream = pyaudio.PyAudio().open(format=pyaudio.paInt16, channels=1, rate=FSAMP, input=True, frames_per_buffer=ROZMIAR_PROB)
  65. stream.start_stream()
  66.  
  67. # tworzenie funkcji Hanninga
  68. window = 0.5 * (1 - np.cos(np.linspace(0, 2 * np.pi, PROBKI_NA_FFT, False)))
  69.  
  70. # wypisanie poczatkowego tekstu
  71. print('pobieranie probek w:', FSAMP, 'Hz z maksymalna rozdzielczoscia', KROK_CZESTOTLIWOSCI, 'Hz')
  72.  
  73. # otrzymywane dane w czasie:
  74. while stream.is_active():
  75.  
  76.     # przesuwanie bufora i wprowadzenie nowych danych
  77.     buf[:-ROZMIAR_PROB] = buf[ROZMIAR_PROB:]
  78.     buf[-ROZMIAR_PROB:] = np.fromstring(stream.read(ROZMIAR_PROB), np.int16)
  79.  
  80.     # Uruchom szybka transformate fouriera na okiennym buforze
  81.     fft = np.fft.rfft(buf * window)
  82.  
  83.     # pobierz czestotliwosc maksymalnej wartosci z zakresu
  84.     czestotliwosc = (np.abs(fft[imin:imax]).argmax() + imin) * KROK_CZESTOTLIWOSCI
  85.  
  86.     # pobierz numer notatki i najblizsza notatke
  87.     n = czestotliwosc_na_numer(czestotliwosc)
  88.     n0 = int(round(n))
  89.  
  90.     # dane wyjsciowe konsoli, gdy mamy pelny bufor
  91.     numer_klatki += 1
  92.  
  93.  
  94.     if numer_klatki >= KLATEK_NA_FFT:
  95.         print('Numer {:7.2f}     Wysokosc: {:7.2f} Hz     Nota: {:>3s} {:+.2f}'.format(n, czestotliwosc, nazwa_notki(n0), n - n0))
  96.  
  97.  
  98.         # najpierw ustaw figure, os i element wykresu, ktory chcemy animowac
  99.         def Okno(w):
  100.             fig = plt.figure()
  101.             ax = plt.axes(xlim=(0, 2), ylim=(-2, 2))
  102.             line, = ax.plot([], [], lw=2)
  103.  
  104.  
  105.         # funkcja inicjalizacji: wykresla tlo kazdej ramki
  106.         def init():
  107.             czestotliwosc.set_data([], [])
  108.             return czestotliwosc,
  109.  
  110.  
  111.         # funkcja animacji. Nazywa sie to sekwencyjnie
  112.         def oblicz(i):
  113.             x = np.linspace(0, 2, 1000)
  114.             y = np.sin(2 * np.pi * (x - 0.01 * i))
  115.             czestotliwosc.set_data(x, y)
  116.             return czestotliwosc,
  117.             anim = animation.FuncAnimation(fig, animate, init_func=init, frames=100, interval=20, blit=True)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement