用于比较的非周期信号的特征

信息处理 fft 离散信号 互相关 统计数据
2022-02-09 15:39:07

我正在寻找将信号(256 / 512 点离散 | 非周期性)(在从捕获的图像中提取一些特征后获得)与大约 5000 个信号的数据库(256 / 512 点离散 | 非周期性)(由与图像中的功能相同)。这些特征是与捕获的图像的角度和距离。通过在 x 轴上取角度值和在 y 轴上取相应的径向距离(幅度)来构造信号。看两张图。

在此处输入图像描述

该图像有15 个非零点,可以视为数据库中的 5000 个条目之一。

第二张图像 - 采集到的信号:

在此处输入图像描述

该图像是采集到的信号的图像,可以看出它在信号中有12 个非零点这实际上是第一幅图像的对应信号,但有一些缺失点和一些幅度变化。

以上只是包含15个非零的数据库条目之一和包含12个非零的采集信号的示例。数据库中可以有许多条目包含相同数量的非零,但非零的位置当然会有所不同。数据库特定条目中非零的数量从 5 到 50 不等。

现在将其视为要比较的信号。

有两个瓶颈 - 首先,获取的信号包含数据库中相应信号的缺失点。缺失的分数有时会非常高。这可以看作是两个信号之间的相关性有时会从 1 下降到 0.5我仍然可以应用相关性并寻找正确的信号匹配。

但是,第二个瓶颈出现了,那就是我不想将获取的信号与数据库的每个条目相关联(因为这需要大量时间)。相反,我想首先根据可以从信号中计算出的一些特征来筛选一些条目。该特征可以是均值、方差、标准偏差、3 dB 带宽等。但是,如我之前所述,在遗漏某些点的情况下,该特征必须变化不大。我还想过在信号上应用 FFT 并使用一些特征,例如绝对值的平均值、相位信息等。

最终,我尝试了均值、方差、标准差、功率带宽、 FFT 绝对值的均值然而,变化是相当剧烈的,我不能入围一小部分(我指的是 1000 左右)。同时,正如我之前提到的,在某些情况下,相关性也急剧下降,因此无法找到匹配项。当获取的信号从相应的数据库信号中丢失点时,您对如何解决这个比较问题有什么建议吗?任何想法表示赞赏!谢谢!

2个回答

这只是一个想法,但滑动窗口中的术语的平均值如何。

x = zeros(1,250);
c = randi(50,1,15);
x(c) = randi(500,1,15);
y = x;
d = randi(15,1,3);
y(c(d)) = 0;

figure;
stem(x,'LineWidth',1); hold on; stem(y,'LineWidth',1);
legend('Original Signal','Signal with Missing Samples');

在此处输入图像描述

N = 5;
L = numel(x)/N;
[m, m1] = deal(zeros(1,L));

for i = 1:L
    mx(1,i) = mean(x((i-1)*N+1:i*N));
    my(1,i) = mean(y((i-1)*N+1:i*N));
end

figure;
stem(mx,'LineWidth',1); hold on; stem(my,'LineWidth',1);
legend('Mean of x', 'Mean of y');

在此处输入图像描述

正如你所看到的,现在的情节非常相似。您还可以检查它们的互相关性:

figure;
stem(xcorr(mx,my),'LineWidth',2);

在此处输入图像描述

当然,这些只是让您入门的想法。现在您可以使用窗口大小来代替,您可以尝试等,并将均值替换为其他统计参数,看看哪个效果最好为你。1:NN+1:2N1:N2:N+1

希望能帮助到你!

只取内积有什么问题?

下面是尝试生成像您建议的那样的数据库:5000 个信号,其中包含 256 个系数,其中大部分为零。

在这种情况下,我将每个偶数信号设置为与奇数先验奇数信号相同,只是随机选择了一些缺失的系数。

green左边的圆圈显示了第一个信号与自身的内积值;red圆圈显示第一个信号与第二个信号的内积值(应该相同,缺少条目)。

在 2010 MacBook Pro 上运行该代码大约需要 0.298 秒(是的,我知道,我需要一个新的)。

在此处输入图像描述


下面的R代码

#30451

signalLength <- 256
numberOfSignals <- 5000

database <- array(0,c(signalLength,numberOfSignals))

for (signal in seq(1,numberOfSignals-1,2))
{
  ix <- sample(signalLength,runif(1,min = 10, max = 15))
  database[ix,signal] <- runif(length(ix),min = 400, max = 600)
  ix2 <- sample(ix,10)
  database[ix2,signal+1] <- database[ix2,signal]
}

plot(colSums(database[,1]*database))
points(1,database[,1] %*% database[,1], col="green", lwd=5)
points(1,database[,2] %*% database[,2], col="red", lwd=5)
其它你可能感兴趣的问题