在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) = d p(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
我想创建一个从频率 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) = d p(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