离散信号分解算法

信息处理 分解
2022-01-26 20:13:52

我正在构建一个传感器,并试图了解如何处理它产生的信号。传感器有一个参考信号库。当“事件 a”发生时,它产生信号 A,当“事件 B”发生时,它产生信号 B。例如:

在此处输入图像描述

有可能发生多个(但很少)事件,并且它们的信号会线性相加。我正在寻找一种信号分解算法,它利用分解是离散的这一事实(它只能给出库信号的整数倍)。我还需要对识别的可靠性进行一些衡量。

前任:

输入:( 在此处输入图像描述 我通过 A + 2 * B + 噪声制作了这张图片)

Example Output:
A + 2 B  -  95% confidence
A + B    -  3% confidence
A        -  1% confidence
None of the Above - 1% confidence    

我注意到我可以通过采用标准化建议解决方案和输入信号的内积来比较两种不同的可能性。例如:

输入信号。(A + 2 B) = 0.999

输入信号。(A + B) = 0.985

所以第一个解决方案是更接近输入信号的匹配。我曾想过使用 Newton-Raphson 来最大化这个内部产品,但是当实际使用传感器时,它的库中可能有 1000 多个信号,这是不现实的。

1个回答

我只是采取 KIS(保持简单)方法作为第一步。

将您的(未知)信号定义为 然后只定义错误: 然后你的估计被选为:

s(t)=kA(t)+mB(t)+n(t)
e(k~,m~)=t|s(t)k~A(t)m~B(t)|2
k^m^
(k^,m^)=argmine(k~,m~)

下面的 R 代码执行此操作,并且输出似乎做了正确的事情。这里是均值为零且标准差为的高斯噪声。n(t)0.1

在此处输入图像描述

实际的值在绿色圆圈处,估计值是它下方的蓝色对角线(在最右边的图中)。km

这似乎适用于的任何值,包括零。您也可以将其扩展为更多信号等。kmC(t)D(t)


下面的R代码

# 30067

prototype_length <- 40

A <- rep(0, prototype_length)
A[(prototype_length/4+1):(3*prototype_length/4)] <- sin(2*pi*seq(0,prototype_length/2-1)/prototype_length)


B <- rep(0, prototype_length)
B[(prototype_length/2+1):(prototype_length)] <- `^`(sin(2*pi*seq(0,prototype_length/2-1)/prototype_length),12)*3/8

par(mfrow = c(1,3), pty="s")
plot(A, type="l", col="blue", lwd=5)
lines(B, col="red", lwd=5)
title('Original Signals')

k <- sample(0:10, 1)
m <- sample(0:10, 1)

data <- k*A + m*B + 0.1 * rnorm(prototype_length, 0, 0.1)
plot(data, type="l")
title('Scaled & Added Signals')

err <- array(0,c(11,11))
kvals <- array(0,c(11,11))
mvals <- array(0,c(11,11))
for (khat in 0:10)
{
  for (mhat in 0:10)
  {
    err[khat+1,mhat+1] <- sum('^'(abs(data - khat*A - mhat*B), 2))
    kvals[khat+1,mhat+1] <- khat
    mvals[khat+1,mhat+1] <- mhat
  }
}

image(0:10,0:10,err, xlab="k hat", ylab = "m hat")
ix <- which.min(err)
lines(kvals[ix] + c(-0.2,0.2), mvals[ix]+ c(-0.2,0.2), col="blue", lwd = 10)
points(k, m, col="green", lwd = 10)
title('Error, actual values, and minimum')