簡體   English   中英

使用python從頻率數組中進行音調掃描

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM