我正在尝试用 python 编写一个脚本来检测任何给定输入音频文件中是否存在简单的警报声音。我解释了我的解决方案,如果有人可以确认它是一个好的解决方案,我将不胜感激。任何其他可以在 python 中实现的解决方案都是值得赞赏的。
我这样做的方法是通过计算两个信号的 FFT(一个是相反的)来计算两个信号的互相关,然后将它们相乘,然后计算结果的 IFFT。然后找到结果的峰值并将其与预先指定的阈值进行比较,以确定是否检测到警报声音。
这是我的代码:
import scipy.fftpack as fftpack
def similarity(template, test):
corr = fftpack.irfft(fftpack.rfft(test , 2 * test.size ) * \
fftpack.rfft(template[:-1] , 2 * template.size ))
return max(abs(corr))
Run Code Online (Sandbox Code Playgroud)
template 和 test 是信号数据的一维列表。rfft 的第二个参数用于填充零以计算 FFT。但是,我不确定应该添加多少个零。另外,在应用 FFT 之前我应该对给定信号进行归一化吗?例如,根据模板信号的峰值对其进行归一化?
假设我有2个字符串:
AACCCGGAAATTTGGAATTTTCCCCAAATACG
CGATGATCGATGAATTTTAGCGGATACGATTC
Run Code Online (Sandbox Code Playgroud)
我想找到我应该多少移动第二个字符串,使其与第一个字符串最匹配.
有2例.第一个是我们假设字符串被缠绕,第二个是我们没有.
是否有一个matlab函数返回N个数组或2N + 1个值数组,以确定移位的字符串2与字符串1的相关程度?
如果没有,是否有更快/更简单的方法
result = zeroes(length, 1)
for i = 0:length-1
result(i+1) = sum (str1 == circshift(str2, i));
end
Run Code Online (Sandbox Code Playgroud) 我使用 R 计算了两个时间序列的互相关。ccf()我知道如何得出置信限:
ccf1 <- ccf(x=x,y=y,lag.max=5,na.action=na.pass, plot=F)
upperCI <- qnorm((1+0.95)/2)/sqrt(ccf1$n.used)
lowerCI <- -qnorm((1+0.95)/2)/sqrt(ccf1$n.used)
Run Code Online (Sandbox Code Playgroud)
但我真正需要的是最大相关性的 p 值。
ind.max <- which(abs(ccf1$acf[1:11])==max(abs(ccf1$acf[1:11])))
max.cor <- ccf1$acf[ind.max]
lag.opt <- ccf1$lag[ind.max]
Run Code Online (Sandbox Code Playgroud)
如何计算这个 p 值?我到处搜索,但在任何地方都找不到好的答案。
We have a simple panel data set in long form, which has the following structure:
i t x
1 Aug-2011 282
2 Aug-2011 -220
1 Sep-2011 334
2 Sep-2011 126
1 Sep-2012 -573
2 Sep-2012 305
1 Nov-2013 335
2 Nov-2013 205
3 Nov-2013 485
Run Code Online (Sandbox Code Playgroud)
I would like to get the cross-correlation between each i within the time-variable t.
This would be possible by converting the data in wide format. Unfortunately, this approach is not feasible due to the …
我正在尝试使用Python查看天文光谱,并且正在使用numpy.correlate尝试查找径向速度偏移。我正在将每个光谱与一个模板光谱进行比较。我遇到的问题是,无论我使用哪种光谱,numpy.correlate都指出,相关函数的最大值出现在零像素偏移处,即光谱已经对齐,这显然是不正确的。 。以下是一些相关代码:
corr = np.correlate(temp_data, imag_data, mode='same')
ax1.plot(delta_data, corr, c='g')
ax1.plot(delta_data, 100*temp_data, c='b')
ax1.plot(delta_data, 100*imag_data, c='r')
Run Code Online (Sandbox Code Playgroud)
此代码的输出如下所示:
请注意,尽管模板(蓝色)和观察到的(红色)光谱清楚地显示了偏移,但互相关函数在零像素偏移处仍达到峰值。我希望看到的有点像(尽管不完全一样;这只是我可以产生的最接近的表示形式):
在这里,我在模板数据中引入了50个像素的人为偏移,现在它们或多或少地排列在一起。我想要的是,在这样的情况下,峰值出现在50个像素的偏移处而不是零处(我不在乎底部的光谱是否排列整齐;这仅仅是为了视觉表示) 。但是,尽管经过数小时的工作和在线研究,但我找不到找到描述此问题的人,更不用说解决方案了。我尝试使用ScyPy的相关函数和MatLib的xcorr,并且bot展示了同样的东西(尽管我被认为是本质上相同的功能)。
为什么互相关不按我期望的方式运行,如何使它以有用的方式运行?
我想在R中使用ccf来计算两组时间序列数据的互相关.我的问题是如何知道图中的任何相关系数是否落在蓝色线之外而没有手动查看它?由于我有数万套时间序列数据需要处理.提前致谢!
我正在尝试使用 NPP 互相关库实现图像置换方法。
我尝试通过在内存中生成几个简单的图像来创建一个简单的解决方案,输出 Npp8u 或 Npp32f 数组。然而,互相关库会产生无意义或无效(即 NAN)的结果。
int main(int argc, char* argv[])
{
Npp8u* gpuImg1, * gpuImg2;
Npp32f *gpuDest;
cudaDeviceInit(argc, (const char**)argv);
long dataSize1 = 128;
auto err = cudaMalloc((void**)&gpuImg1, dataSize1 * dataSize1 * sizeof(unsigned char));
auto img1Data = static_cast<unsigned char*>(malloc(dataSize1 * dataSize1 * sizeof(unsigned char)));
memset(img1Data, 0, dataSize1 * dataSize1);
for(auto y = 40; y < 60; y++)
{
for(auto x = 20; x < 40; x++)
{
img1Data[y * dataSize1 + x] = 0xff;
}
} …Run Code Online (Sandbox Code Playgroud) correlation ×2
python ×2
r ×2
time-series ×2
convolution ×1
cuda ×1
matlab ×1
npp ×1
numpy ×1
p-value ×1
panel ×1
panel-data ×1
scipy ×1
stata ×1