[英]Tone sweep from array of frequencies with python
我有帶有頻率值的數組,並且想要生成帶有在給定值之間掃描的音調的 wav 文件。 說
freqs = [100, 100, 200, 400, 1000, 100, 50]
duration = 7
我想要持續時間為 7 秒的 WAV。 所以從 T=0 到 T=1s 音調應該是 100Hz,從 T=1 到 T=2 從 100Hz 掃描到 200Hz 等等。
如何生成波形以傳遞給 scipy.io.wavfile.write?
以下是對兩個任意頻率執行此操作的方法:
import numpy as np
from scipy.signal import chirp
from scipy.io.wavfile import write
interval_length = 1 # in seconds
fs = 16000 # sampling of your signal
f0 = 100 # frequency 1
f1 = 200 # frequency 2
t = np.linspace(0, interval_length, int(fs * interval_length))
w = chirp(t, f0=f0, f1=f0, t1=interval_length, method='linear') # check also other methods
write('test.wav', fs, w)
我留下作為練習,讓您在循環中為您擁有的一組頻率執行此操作。
正如Lukasz Tracewski 所說,這可以通過np.chirp() 完成:
import numpy as np
from scipy.signal import chirp
from scipy.io.wavfile import write
duration = 30
Fs = 16000
freqs = [100, 100, 300, 300, 600, 100, 100]
segment = int(Fs * duration / (len(freqs)-1))
f = np.array(freqs) / Fs
wav = np.array(1)
for f0, f1 in zip(f[:-1], f[1:]):
wav = np.append(wav, chirp(np.arange(segment), f0=f0, t1=segment, f1=f1))
write('test.wav', Fs, wav)
這給出了很好的頻譜圖: 聽這里: https : //soundcloud.com/dcoder_mm/npchip/s-Kx8L2vN0nfv
它有效,但您可以注意到(在頻譜上和聆聽時)一些咔噠聲。
讓我們嘗試使用較低的頻率:
freqs = [100, 100, 300, 300, 600, 100, 100]
聽這里: https : //soundcloud.com/dcoder_mm/dj-npchirp-feat-low-frequencies/s-fNsA61bJ0Wk
事情變得更糟。 為什么?
為了擺脫這種情況,我們需要計算相位校正。 根據最后一點的維基階段(對於線性啁啾!)將是:
phi = T*(f1+f0)/2
所以這將完成這項工作:
import numpy as np
from scipy.signal import chirp
from scipy.io.wavfile import write
duration = 30
Fs = 16000
freqs = [100, 100.5, 99, 99.3, 100.1, 100]
segment = int(Fs * duration / (len(freqs)-1))
f = np.array(freqs) / Fs
wav = np.array(1)
phase = 0
for f0, f1 in zip(f[:-1], f[1:]):
wav = np.append(wav, chirp(np.arange(segment), f0=f0, t1=segment, f1=f1, phi=phase))
phase = phase + 360*(segment*(f0+f1)/2)
write('test3.wav', Fs, wav)
聽: https : //soundcloud.com/dcoder_mm/dj-npchirp-feat-low-frequencies-phase-c/s-XneSWRlojLD
請注意,phi = T*(f1+f0)/2 僅適用於線性啁啾。 對於其他方法,您需要不同的相位公式。 也看到這個問題
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.