有没有一种方法可以计算出由多个锯齿函数组成的信号的基频?我有一个必不可少的信号,它由x个嘈杂的锯齿组成,我想获得它们的幅度和频率。参见下面的python代码:
from scipy import signal
import numpy as np
import matplotlib.pyplot as plt
t = np.linspace(0, 1, 100)
y = signal.sawtooth(1 * np.pi * t) + 0.1*signal.sawtooth(4 * np.pi * t) + 0.01*signal.sawtooth(50 * np.pi * t)
plt.plot(t, y)
plt.show()
给出情节 sawtooth function
有没有一种方法可以分解信号以获得类似这样的信号:
Frequency Amplitude
1 1
4 0.1
50 0.01
我尝试使用FFT,但是信号与上面的信息不太吻合。如果不是正弦波/风波,有什么想法可以分解信号的基本部分?
答案 0 :(得分:1)
如果我正确理解了您的查询,则可以使用以下代码:
import numpy as np
import matplotlib.pyplot as plt
from scipy import signal
import scipy.fftpack
# Number of samplepoints : use 2**n powers to optimize FFT
N = 4096 # be aware of Nyquist–Shannon sampling theorem
# Length of your signal
t_f = 20
# sample spacing
T = t_f / N
# Time signal vector
t = np.linspace(0, t_f, N)
#
# first with trigonometric functions to make sure it's working
y = 2*np.cos(t) + 12*np.cos(9*t) + 5*np.cos(42*t) # here you got 1-9-42 harmonics
yf = scipy.fftpack.fft(y) # use FFT algorithm on the temporal signal
xf = np.linspace(0.0, t_f/(2.0*T), N/2) # taking advantage of symmetry of FFT if the signal is real valued
# Plot of the spectral output
fig, ax = plt.subplots()
ax.plot(xf, 2.0/N * np.abs(yf[:N//2]))
plt.show()
具有您的功能:
# now with saw tooth functions
y = signal.sawtooth(1 * np.pi * t) + 0.1*signal.sawtooth(4 * np.pi * t) + 0.01*signal.sawtooth(50 * np.pi * t)
yf = scipy.fftpack.fft(y)
xf = np.linspace(0.0, t_f/(2.0*T), N/2)
# Plot of the spectral output
fig, ax = plt.subplots()
ax.plot(xf, 2.0/N * np.abs(yf[:N//2]))
plt.show()
之后,您可以对这些结果进行后期处理,并获得信号频谱分量的给定频率/幅度。
希望这对您有帮助。问候。
答案 1 :(得分:0)
如果所有锯齿波的周期数足够大,请尝试使用自相关而不是FFT。