:orphan: spectrum -------- Sample microphone input and display power spectrum .. raw:: html ---- .. code-block:: python from __future__ import print_function import pyaudio import numpy as np from scipy import signal import time import gr FS = 44100 # Sampling frequency SAMPLES = 4096 mic = None def get_spectrum(): global mic if mic is None: pa = pyaudio.PyAudio() mic = pa.open(format=pyaudio.paInt16, channels=1, rate=FS, input=True, frames_per_buffer=SAMPLES) amplitudes = np.frombuffer(mic.read(SAMPLES), dtype=np.short) return abs(np.fft.fft(amplitudes / 32768.0))[:SAMPLES // 2] def parabolic(x, f, i): xe = 1 / 2. * (f[i - 1] - f[i + 1]) / (f[i - 1] - 2 * f[i] + f[i + 1]) + x ye = f[i] - 1 / 4. * (f[i - 1] - f[i + 1]) * (xe - x) return xe, ye f = [FS / float(SAMPLES) * t for t in range(0, SAMPLES // 2)] gr.setviewport(0.1, 0.95, 0.1, 0.95) gr.setwindow(50, 25000, 0, 100) gr.setscale(1) start = time.time() while time.time() - start < 10: try: power = get_spectrum() peakind = signal.find_peaks_cwt(power, np.array([5])) except (IOError): continue gr.clearws() gr.setlinewidth(1) gr.setlinecolorind(1) gr.grid(1, 5, 50, 0, 1, 2) gr.axes(1, 5, 50, 0, 1, 2, -0.008) gr.setcharheight(0.020) gr.text(0.15, 0.965, '100Hz') gr.text(0.47, 0.965, '1kHz') gr.text(0.79, 0.965, '10kHz') gr.setlinecolorind(4) gr.polyline(f[1:], power[1:]) for p in peakind: if power[p] > 10: gr.setlinewidth(2) gr.setlinecolorind(2) xe, ye = parabolic(f[p], power, p) print(xe, ye) gr.polyline([xe] * 2, [0, ye]) gr.updatews()