【问题标题】:Comparison of Higher Order Ambisonics Signals高阶 Ambisonics 信号的比较
【发布时间】:2018-04-06 19:44:06
【问题描述】:

我正在使用 matlab 进行一个项目,我必须在其中比较两个(高阶)Ambisonics 脉冲响应。我计算了 FFT 并绘制了两个信号在频率上的平滑能量:

它们似乎是相关的,但我想找到一个值来估计相似度。我不能使用函数xcorr,因为我的信号是Nx25 而不是Nx1。

假设ab 是我的信号,都是8000x25 矩阵:

fs = 48e3;
fft1 = fft(a);
fft2 = fft(b);
l1 = length(a);
l2 = length(b);

% calculating frequencies 
f = fs*(0:(l1/2))/l1;

% calculating single sided spectrum for both signals

P1 = 10*log10(abs(fft1).^2);
P1 = P1(1:l1/2+1);
P1(2:end-1) = 2*P1(2:end-1);

P2 = 10*log10(abs(fft2).^2);
P2 = P2(1:l2/2+1);
P2(2:end-1) = 2*P2(2:end-1);

% plotting both spectra
figure; plot(f,smooth(P1,150)); hold on; plot(f,smooth(P2,150)); grid on

所以我每次有 25 个值(假设每个值代表我的信号的一个通道)。所以xcorr 将允许我将一个频道与另一个频道进行比较。我需要做的是将信号作为一个整体进行比较,因为每个通道都有对信号很重要的空间信息。因此,将一个频道与另一个频道进行比较不会让我得出关于相似性的确切陈述。

感谢您就如何比较这些信号提供帮助和建议。

【问题讨论】:

标签: matlab signal-processing similarity


【解决方案1】:

有很多方法可以比较信号。让我们首先区分两个主要选项:(1) 信号应该在每个时间点进行比较,而不发生偏移,或者 (2) 信号应该以时间不变的方式进行比较,允许一个相对于另一个的偏移.


情况 (2) 通常归结为互相关函数,例如由 xcorr 计算的。该函数的最大值表示在使相关性最大化的时间偏移下的相关性。也就是说,我们及时移动一个信号以找到它与另一个信号最大相关的位置,然后量化该相关性。可以这样计算:

sim = max(ifft(fft(a).*conj(fft(b))));

上面独立计算ab的每个通道的相关性,为每个通道生成一个值。由于要将a的所有通道与b的所有通道进行比较,所以需要建立一个矩阵。一个简单的方法是在 MATLAB 中使用新的隐式单例扩展:

b = reshape(b,[],1,25);
sim = max(ifft(fft(a).*conj(fft(b))));
sim = squeeze(sim);

上面生成了一个 25x25 的相关矩阵。如果您在计算时遇到错误,您可能使用的是旧版本的 MATLAB。这段更丑陋的代码做同样的事情:

b = reshape(b,[],1,25);
sim = max(ifft(bsxfun(@times,fft(a),conj(fft(b)))));
sim = squeeze(sim);

案例(1)更有趣,因为除了相关性之外还有更多选择:(根)均方误差,平均绝对误差,rank correlationmutual informationtotal correlation,和一长串等等。其中一些计算起来很简单,有些则更复杂。但即使是最复杂的一个,您也可以使用两个 for 循环为所有通道组合计算:

sim = zeros(25,25);
for ii = 1:25
  for jj = 1:25
    sim(ii,jj) = similarity_function(a(:,ii),b(:,jj)); % whatever you want to fill in here!
  end
end

这在很大程度上取决于信号的特性,哪种测量最有用。如果您对诸如均方根误差之类的简单事物感兴趣,可以使用隐式单例展开再次为每一对计算它:

b = reshape(b,[],1,25);
sim = sqrt(mean((a-b).^2));
sim = squeeze(sim);

最后,我们需要将成对通道比较的 25x25 矩阵缩减为单个度量。同样,有不同的选择。一种可能性是简单地查看两个最相似的渠道,或两个最不同的渠道:

max(sim(:))
min(sim(:))

或者我们可以对所有组合进行一些统计:

mean(sim(:))
median(sim(:))
sum(sim(:))
sqrt(mean(sim(:).^2));

另一种选择是在b 中找到与a 中的每个频道最匹配的频道:

sim = min(sim,[],2);

这将为a 的每个通道返回一个值。同样,您可以取最大值或最小值,或计算前面讨论的任何其他统计数据。

【讨论】:

  • 我已经编辑了帖子,所以也许我的问题现在得到了更好的体现。
  • @shahd_hares:因此,您想将 25 个通道中的每一个通道与第二组 25 个通道中的每一个通道进行比较,并获得一个 25x25 相似度的数组,或者您想将其总结为单值?
  • 如果可能的话,我想把它总结成一个值。
猜你喜欢
  • 1970-01-01
  • 2011-09-27
  • 1970-01-01
  • 1970-01-01
  • 2012-02-23
  • 2019-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多