重叠频率的分离

信息处理 傅里叶变换 傅立叶 分解
2022-01-25 15:43:36

我有一个具有多个频率的信号,其中两个重叠,其中一个是我的主频率。

是否有任何技术可以分离几乎重叠的两个频率?我可以提高采样率,但不能提高窗口大小

我已经尝试过 SVD、PCA、ICA,但没有一种方法能够分解这两个频率。

N=200
x = np.zeros(N)
y = np.zeros(N)
z = np.zeros(N)
k = np.zeros(N)
x[0] = np.cos(2*np.pi)*np.cos(2*np.pi*0.1)
y[0] = np.cos(2*np.pi)*np.sin(2*np.pi*0.1)
z[0] = np.sin(2*np.pi)*np.cos(2*np.pi*0.1)
k[0] = np.sin(2*np.pi)*np.sin(2*np.pi*0.1)
for i in range(1,N):
  x0=x[i-1]
  y0=y[i-1]
  z0=z[i-1]
  k0=k[i-1]
  x[i] = x0*np.cos(2*np.pi*0.31) - y0*np.sin(2*np.pi*0.31)
  y[i] = x0* np.sin(2*np.pi*0.31)+ y0*np.cos(2*np.pi*0.31)
  z[i] = z0* np.cos(2*np.pi*0.32)- k0*np.sin(2*np.pi*0.32)
  k[i] = z0* np.sin(2*np.pi*0.32)+ k0*np.cos(2*np.pi*0.32)
  y[i]+=0.3*(x[i]**2-z[i]**2)
  k[i]+=0.3*(x[i]*z[i])
jet= plt.get_cmap('jet')
colors = iter(jet(np.linspace(0,1,30)))
plt.figure(0) 
w=30
for i in range(1,30):
  fourier = np.fft.rfft(x[i:i+w])
  freqs =np.fft.rfftfreq(len(x[i:i+w]))
  color=next(colors)
  plt.plot(freqs,abs(fourier), c=color)  
plt.figure(1) 
fourier = np.fft.rfft(x)
freqs =np.fft.rfftfreq(len(x))
plt.plot(freqs,abs(fourier), c='k')  
plt.show()

在此处输入图像描述

2个回答

我刚刚查看了您的信号,如果在具有适当窗口的移动平均线之后您得到显示的信号,您正在处理正弦调制,这使得您的信号在较小的窗口中非平稳(非平稳意味着您的信号的频率内容随时间变化)。这也是您看到重叠频率的主要原因(只需从重叠频率中减去基频,这就是您的调制频率)。因此,应用过滤器的成功可能有限。

如果您的信号足够长(可能是 1000 个周期性周期),请执行以下操作(假设您的信号是X你的基波的旋转频率是ω0

p()=X×s一世n(ω0+φ)

()=0p()/

如果窗口足够大(例如 1000在哪里0是您的主要信号的周期),()将是一个常数值。您的基本信号将是X1()=()×s一世n(ω0|+φ)

但是如何获取参数φ是主要问题。一种启发式方法是,假设频率分量重叠信号小于您的实际基频,并且信号没有中断,您可以在信号之间进行回归X()和具有您感兴趣的基频的正弦信号一种×s一世n(ω0+φ). 一旦你做了回归并实现了φ,将其替换为上面的公式,您就可以开始了。正如我所说,这是启发式的,可以给你一个接近的估计,这取决于你想要的准确程度是否有用。

顺便说一句,你不是在处理非线性,因为它们会产生谐波,而谐波是基频的多个整数。似乎您正在处理正弦调制,并且在较小的窗口中您可以将其称为非平稳性。

希望它有所帮助。

如果您的信号完全静止,请继续使用“正弦拟合”并取出您不感兴趣的频率。然后你有一个无干扰的信号。虽然我猜这些信号不是彼此的多个整数,但您的主频率也将被低通滤波。您还可以使用具有类似行为的陷波滤波器。

如果您找到了好的答案,请更新我们。