≡ Menu

Generare segnali acustici con frequenze variabili in Python

Creare un segnale acustico con frequenza variabile può essere utile in molte situazioni, come ad esempio la calibrazione dell’audio o la creazione di effetti sonori. In questo articolo, esploreremo come generare un segnale acustico che varia linearmente tra 20 Hz e 20.000 Hz utilizzando Python e la libreria sounddevice. Spiegheremo anche il funzionamento del codice, che può essere facilmente modificato per adattarsi alle esigenze specifiche del progetto.

Per iniziare, è necessario installare le librerie sounddevice e numpy. Queste librerie possono essere installate utilizzando pip:

pip install sounddevice numpy

Di seguito è riportato il codice completo in Python per generare un segnale acustico con frequenza variabile tra 20 Hz e 20.000 Hz:

import numpy as np
import sounddevice as sd
import time

sample_rate = 44100  # Campioni al secondo
duration = 0.1  # Durata di ogni suono in secondi
freq_start = 20  # Frequenza iniziale in Hz
freq_end = 20000  # Frequenza finale in Hz
num_steps = 100  # Numero di passi tra la frequenza iniziale e finale

def generate_tone(freq, duration, sample_rate):
    num_samples = int(sample_rate * duration)
    t = np.linspace(0, duration, num_samples, False)
    signal = 0.5 * np.sin(2 * np.pi * freq * t)
    return signal.astype(np.float32)

def play_signal(signal, sample_rate):
    sd.play(signal, sample_rate)
    sd.wait()

for i in range(num_steps):
    freq = freq_start + i * (freq_end - freq_start) / num_steps
    print(f"Frequenza: {freq:.2f} Hz")
    signal = generate_tone(freq, duration, sample_rate)
    play_signal(signal, sample_rate)
    time.sleep(0.05)

Spiegazione del codice:

  1. Importazione delle librerie: Importiamo le librerie numpy per le operazioni matematiche, sounddevice per l’output audio e time per gestire le pause tra i suoni.
  2. Definizione dei parametri: Definiamo alcuni parametri come il sample rate (campioni al secondo), la durata di ogni suono, le frequenze iniziale e finale, e il numero di passi tra le frequenze.
  3. Funzione per generare il segnale sinusoidale: Questa funzione genera un segnale sinusoidale con la frequenza, la durata e il sample rate specificati come input. Calcoliamo il numero di campioni necessari per la durata specificata, generiamo un array di valori di tempo e, infine, calcoliamo il segnale sinusoidale con la frequenza specificata. Il segnale viene convertito nel formato float32 e restituito.
  4. Funzione per riprodurre un segnale: Questa funzione utilizza la libreria sounddevice per riprodurre il segnale audio fornito con il sample rate specificato. La funzione sd.wait() attende la fine della riproduzione del suono.
  5. Riproduzione del segnale acustico e visualizzazione della frequenza: In un ciclo for, calcoliamo la frequenza corrente linearmente interpolando tra freq_start e freq_end. Visualizziamo la frequenza corrente, generiamo il segnale sinusoidale con la funzione generate_tone e lo riproduciamo con la funzione play_signal. Infine, mettiamo in pausa il programma per 0,05 secondi (time.sleep(0.05)) prima di passare al passo successivo.
{ 0 comments… add one }

Rispondi