找到numpy数组之间最小差异的位置

2024-05-02 07:54:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个音乐文件:一个是无损的,声音间隔很小(此时只是静音,但可以是任何东西:正弦波或只是一些噪音)和一个mp3:

In [1]: plt.plot(y[:100000])
Out[1]: 

Lossless file

^{pr2}$

mp3 file

这个列表是相似的,但不完全相同,所以我需要缩小这个差距,以找到一个列表在另一个列表中的第一次出现,且增量误差最小。在

下面是我的解决方案(5.7065秒):

^{3}$

有什么Python式的方法可以解决这个问题吗?在

编辑: 在计算特殊点之间的平均距离(例如,数据==0.5)后,我将搜索区域从25000减少到2000。这给了我0.3871s的合理时间:

a = np.where(y[:100000].round(1) == 0.5)[0]
b = np.where(y2[:100000].round(1) == 0.5)[0]

mean = int((a - b[:len(a)]).mean())
delta = 1000

error = []
for i in range(mean - delta, mean + delta):
...

Tags: in声音列表间隔np静音pltmean
3条回答

你要做的是这两个信号的cross-correlation。在

使用scipy库中的^{}可以轻松完成此操作:

import scipy.signal
import numpy as np

# limit your signal length to speed things up
lim = 25000

# do the actual correlation
corr = scipy.signal.correlate(y[:lim], y2[:lim], mode='full')

# The offset is the maximum of your correlation array,
# itself being offset by (lim - 1):
offset = np.argmax(corr) - (lim - 1)

您可能想看看类似问题的this答案。在

让我们先生成一些数据

N = 1000
y1 = np.random.randn(N)
y2 = y1 + np.random.randn(N) * 0.05
y2[0:int(N / 10)] = 0

在这些数据中,y1y2几乎是相同的(注意添加的小噪声),但是{}的前10%是空的(类似于您的示例)

我们现在可以计算两个向量之间的绝对差,并找到第一个绝对差值低于灵敏度阈值的元素:

^{pr2}$

sample data plotted

如果重叠部分确实“几乎完全相同”,则此方法有效。如果相似度较低,您将不得不考虑更聪明的对齐方式。在

我想你要找的是相关性。这里有一个小例子。在

import numpy as np

equal_part = [0, 1, 2, 3, -2, -4, 5, 0]
y1 = equal_part + [0, 1, 2, 3, -2, -4, 5, 0]
y2 = [1, 2, 4, -3, -2, -1, 3, 2]+y1

np.argmax(np.correlate(y1, y2, 'same'))

输出:

^{pr2}$

所以这会返回时间差,两个信号之间的相关性达到最大值。如您所见,在这个例子中,时差应该是8,但这取决于您的数据。。。 还要注意两个信号的长度相同。在

相关问题 更多 >