簡體   English   中英

在numpy中的兩個頻率之間進行插值

[英]Interpolating between two frequencies in numpy

我想創建一個從頻率f1開始到頻率f2結束的正弦波。 這是我使用的代碼:

import matplotlib.pyplot as plt
import numpy as np

def freq_interp(dur,f1,f2,fs=44100):
    num_samples = fs*dur
    t = np.linspace(0,dur,num_samples)
    a = np.linspace(0,1,num_samples)
    f = (1-a)*f1+a*f2 # interpolate
    samples = np.cos(2*np.pi*f*t)
    return samples,f

當我嘗試生成WAV文件或僅繪制信號的STFT時,會得到意外的結果。 例如,我使用下面的代碼:

def plot_stft(sig,fs=44100):
    f, t, Zxx = signal.stft(sig,fs=fs,nperseg=2000)
    plt.pcolormesh(t, f, np.abs(Zxx), vmin=0, vmax=0.1)
    plt.ylim(0,2000)
    plt.title('STFT Magnitude')
    plt.ylabel('Frequency [Hz]')
    plt.xlabel('Time [sec]')
    plt.show()

s,f = freq_interp(dur=2,f1=1,f2=1000)
plt.plot(f)
plt.show()
plot_stft(s)

s,f = freq_interp(dur=2,f1=1000,f2=1)
plt.plot(f)
plt.show()
plot_stft(s)

我得到這些情節: 在此處輸入圖片說明

該問題在第二行中更加明顯。 頻率在t = 1s處反彈。 同樣在第一行中,您可以看到頻率上升到2000Hz,這是錯誤的。 知道為什么會發生這種情況以及如何解決嗎?

正弦波是sin(p(t)),其中p(t)是相位函數。 頻率函數為f(t)= dp(t)/ dt,要計算p(t),首先要計算f(t),然后對其進行積分。 最簡單的集成方法是使用cumsum()

def freq_interp(dur,f1,f2,fs=44100):
    num_samples = int(fs*dur)
    t = np.linspace(0,dur,num_samples)
    f = np.linspace(f1, f2, num_samples)
    phase = 2 * np.pi * np.cumsum(f) / fs
    samples = np.cos(phase)
    return t, samples

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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