确定三个信号中哪个最接近正弦曲线

信息处理 算法 相关性 连贯性
2022-02-15 04:29:38

我有一些来自传感器的加速度值。这些值报告为加速度的 x、y 和 z 分量。从附图中可以看出,很明显 z 信号具有清晰的正弦曲线。是否有任何算法来量化曲线的“正弦曲线”。我正在尝试编写一种算法,将附加图像的 z 信号识别为最正弦的。

在此处输入图像描述

另一个例子如下图所示: 对于这个图像,x 轴包含 < most sinusoidal > 信号,算法必须能够将 x 轴识别为正确的轴。 在此处输入图像描述

编辑:在没有最正弦信号的情况下,任何轴的变化确实可能更大。这里要解决的原始问题是计算加速度计信号中的呼吸次数。为此,首先必须识别包含呼吸信号的轴。从图像中可以明显看出,对于第一张图像,z 轴具有呼吸数据,而对于第二张图像,x 轴具有呼吸数据

3个回答

识别这 3 个中的“最正弦曲线”是否足够,或者您是否还想要这些的线性投影(与 IMU 传感器相对于运动平面倾斜一致)?

一个简单的解决方案可能是进行窗口 fft 并选择 fft 幅度的“波峰因数”最大的方向(最好用单个正弦曲线解释)。

编辑:看来你的«正弦»有些可变。如果上述方法失败,则可能移除 DC 分量(“高通滤波器”),然后移除高频边缘和脉冲(低通滤波器),以获得有效的调谐带通滤波器,然后对样本进行平方和求和。

为什么不直接用 FFT 看看哪个峰值最高呢?

下面的代码生成示例数据:

产生的信号

然后对其进行 FFT:

生成信号的 FFT

产生:

X总和:0.9999999999999987 Y总和:0.9999999999999994 Z总和:0.9999999999999989

X 最大值:0.17213933316891214 Y 最大值:0.2080419608439683 Z 最大值:0.7112824350827284

根据您的数据,这可能足以选择最正弦的数据。


Python代码仅在下面

import numpy
import matplotlib.pyplot as plt
import scipy.signal as sig
from scipy.fft import fft
import random 


def get_noise(N):
    noise = []
    for i in range(N):
        noise.append(random.gauss(0,1))
    return noise

def normalize(x):
    return [x_1/sum(numpy.abs(x)) for x_1 in x]

N = 1000
b, a = sig.butter(3, 0.25)
n1 = get_noise(N)
n2 = get_noise(N)
n3 = get_noise(N)
x = normalize(sig.lfilter(b,a, n1))
y = normalize(sig.lfilter(b,a, n2))
t = [ t*0.05 for t in range(N) ]
z = normalize(sig.lfilter(b,a, n3) + numpy.sin(t))

figure, axis = plt.subplots(3, 1)
axis[0].plot(x)
axis[1].plot(y)
axis[2].plot(z)

plt.figure(2)
plt.plot(numpy.abs(fft(x)))
plt.plot(numpy.abs(fft(y)))
plt.plot(numpy.abs(fft(z)))

print("X sum: " + str(sum(numpy.abs(x))) + " Y sum:" + str(sum(numpy.abs(y))) + " Z sum:"+ str(sum(numpy.abs(z))))
print("X max: " + str(max(numpy.abs(fft(x)))) + " Y max:" + str(max(numpy.abs(fft(y)))) + " Z max:"+ str(max(numpy.abs(fft(z)))))

看起来您的信号是正弦信号,但不是单一频率。如果这是典型的,那么您可以首先对其将包含的频率范围进行假设,进行 FFT,然后通过对该范围内频率区间的幅度求和来选择该频带中能量最大的通道。您可能还想为此结果设置一个阈值,这样您就不会将随机噪声识别为占用频带的信号。如果您提供更多关于您期望信号是什么的背景信息将会很有帮助……频率范围、噪声水平、在多个通道上的外观等。