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:
- Importazione delle librerie: Importiamo le librerie
numpy
per le operazioni matematiche,sounddevice
per l’output audio etime
per gestire le pause tra i suoni. - 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.
- 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. - Funzione per riprodurre un segnale: Questa funzione utilizza la libreria
sounddevice
per riprodurre il segnale audio fornito con il sample rate specificato. La funzionesd.wait()
attende la fine della riproduzione del suono. - Riproduzione del segnale acustico e visualizzazione della frequenza: In un ciclo for, calcoliamo la frequenza corrente linearmente interpolando tra
freq_start
efreq_end
. Visualizziamo la frequenza corrente, generiamo il segnale sinusoidale con la funzionegenerate_tone
e lo riproduciamo con la funzioneplay_signal
. Infine, mettiamo in pausa il programma per 0,05 secondi (time.sleep(0.05)
) prima di passare al passo successivo.