【问题标题】:How to directly calculate desired phase shift of signals?如何直接计算所需的信号相移?
【发布时间】:2016-08-01 11:48:10
【问题描述】:

我将 2 个组合相移信号 (x_phase_sig_comb) 与给定信号 (x_given) 进行比较。 目前,我正在使用for 循环将每个组合相移信号 (x_phase_sig_comb) 相加,然后计算给定的 RMSE(均方根误差)值信号 (x_given) 然后我将每个值放入一个数组中,然后对最小的 RMSE(均方根误差值)进行排序。

是否有一种代数方法可以直接计算 2 个组合相移信号 (x_phase_sig_comb) 将具有最小、最大或选定范围的 RMS(根与给定信号 (x_given) 相比时的均方误差。我试图避免必须计算每个组合相移信号 (x_phase_sig_comb)

我问的原因是我有非常大的信号,并且循环遍历每个信号需要相当长的时间。使用某种类型的代数“形式”直接计算相对于 (x_given) 的最小、最大或范围 RMSE 值的相移将节省大量时间。我只是不知道如何约束相移信号的频率和幅度,或者如何以代数方式做到这一点。有什么想法吗?

我在下面创建了一个动画,显示了两个信号的相移以及相对于 (x_given) 信号的 RMSE 值。 注意:上图的两个信号是相同的,唯一的区别是一个信号向左移相,另一个信号向右移相。

Ps:我使用的是 octave 4.0,它类似于 matlab 请参阅下面的示例代码

%test compare signals

Fs = 100;                    % Sampling frequency
T = 1/Fs;                     % Sample time
L = 100;                     % Length of signal
t = (0:L-1)*T;                % Time vector
t_plot=linspace(0,Fs,Fs);     %used just for plotting

x = .5*sin(2*pi*10*t)+0.7*sin(2*pi*12.3*t) +.4*sin(2*pi*16.5*t); %main signal
x_given=.4*sin(2*pi*15*t); %given signal to compare it to
data_array=[];

for rr=1:1:100
  x_sig_main_a = circshift(x(:),rr); %shift signal to the right
  x_sig_main_b = circshift(x(:),-rr); %shift signal to the left
  x_phase_sig_comb=x_sig_main_a+x_sig_main_b; %combine shifted signals together

  NFFT = 2^nextpow2(L); % Next power of 2 from length of siganl
  Y = fft(x_phase_sig_comb,NFFT)/L;
  freq = Fs/2*linspace(0,1,NFFT/2+1);

  %find maximum value, it should be the fundamental frequency (approximated)
  [maxidx,maxVal]=max(2*abs(Y(1:NFFT/2+1)));
  freq(maxVal); %max frequency value

  %RMSE
  dy = abs(x_phase_sig_comb(:)-x_given(:)); %absolute error
  MAE  = mean(dy); %mean-absolute-error
  MXE = max(dy); %maximum-absolute-error
  RMSE = sqrt(mean(dy.^2));  %   root-mean-sqare-error 

  %data_tmp=[rr,freq(maxVal)];
  data_tmp=[rr,RMSE];
  data_array=[data_array;data_tmp];

   % Plot .
  subplot(2,1,1);
  plot(t_plot,x_sig_main_a,'-r',t_plot,x_sig_main_b,'-b')
  s1 = strcat('Phase Shift of 2 signals',' - (',num2str(rr),' bits) shifted out of 100' );
  titletxt = {s1};

  title(titletxt,'FontSize',14);

  subplot(2,1,2); plot(data_array(rr,1),data_array(rr,2),'*-r') 
  axis([0 100 0 1.5])
  s1 = strcat('RMSE of 2 combined phase shifted signals to the given signal =',num2str(data_array(rr,2)));
  titletxt = {s1};
  hold on

  title(titletxt,'FontSize',14);
  xlabel('Phase shift of signals')
  ylabel('Root Mean Square Erro')

  pause(.01)
end
subplot(2,1,2); plot(data_array(:,1),data_array(:,2),'*-r'); %connect lines in plot 
data_array_sort = sortrows(data_array,2); %sort by least different 2 
data_array_sort(1:3,:) %Similar combined phase shifted signals to x_given signal

是否有一种代数方法可以直接计算 2 个组合相移信号 (x_phase_sig_comb) 将具有最小、最大或选定范围的 RMS(均方根)的相移与给定信号 (x_given) 相比时的平方误差。我试图避免必须计算每个组合相移信号 (x_phase_sig_comb)

我问的原因是我有非常大的信号,并且循环遍历每个信号需要相当长的时间。使用某种类型的代数“形式”直接计算相对于 (x_given) 的 RMSE 值最小、最大或范围的相移将节省大量时间。我只是不知道如何约束相移信号的频率和幅度,或者如何以代数方式做到这一点。有什么想法吗?

【问题讨论】:

  • 我了解您有两个信号,一个“给定”信号和一个“主”信号,并且您正试图以某种方式匹配给定信号以尽可能接近主信号(在 RMS -感觉)尽可能。但是你为什么要延迟主信号 +rr-rr 样本并添加它们并将 that 与给定信号进行比较?此外,您使用“相移”一词来表示“移相”。对信号进行相移是将其乘以exp(j*phi),但您的代码只是在延迟。那么它是相移还是延迟?你是什​​么really trying to accomplish
  • 你说的是互相关吗?
  • @Ahmed Fasih 这是一个相移参见视频,解释了相移youtu.be/30J5U0ThRUc +rr 和 -rr 表示将在左耳和右耳中播放的内容,组合信号将产生双耳节拍。
  • @RickT:您链接的视频仅显示具有相同频率的鼻窦信号。如果您只有一个频率,则延迟与相移具有相同的效果。正如艾哈迈德已经说过的那样,只要您有多个频率(如上面的示例),恒定的时间延迟就与相移不同。我猜你想弄清楚两个信号之间的时间延迟,直到“匹配”。这可以使用互相关来完成(请参阅 S Geurts 答案)
  • @Andy 感谢您的帮助,它会起作用,除了相关的一个信号不会“移动”参见视频youtu.be/RO8s1TrElEw,但我的信号同时在相反的“方向”移动x_sig_main_a = circshift(x(:),rr); %shift 信号向右 x_sig_main_b = circshift(x(:),-rr); %shift 信号向左。是否可以调整相关性以使两个信号同时向不同方向移动?

标签: matlab fft octave combinatorics algebraic-data-types


【解决方案1】:

也许您可以使用相关性来代替 RMS。

[Correlation,lag] = xcorr(x,x_given)
[~,index] = max(abs(Correlation))
timeshift = lag(index)

关于函数xcorr的文档

【讨论】:

  • 这只是用“相关性”替换“RMS”,主要问题是我仍然必须将每个组合相移信号(x_phase_sig_comb)加在一起,然后我计算是否不使用 RMSE 使用相关性。原因是我的信号非常大,循环遍历每个信号需要相当长的时间。使用某种代数“形式”直接计算相对于 (x_given) 的最小、最大或一定范围的 RMSE / 相关值的相移将节省大量时间。
  • Correlation 替换了您的循环,因此您不需要循环。相关性的最大值对应于两个信号最匹配的某个时间偏移(我在我的建议中更改了一些变量名称以使其更清晰)。当你现在主频率时,你可以从时移计算相位。
  • @S Geurts 感谢您的帮助,它会起作用,除了相关的一个信号不会“移动”参见视频youtu.be/RO8s1TrElEw,但我的信号同时在相反的“方向”移动时间x_sig_main_a = circshift(x(:),rr);%shift 信号向右x_sig_main_b = circshift(x(:),-rr);%shift 信号向左。是否可以调整相关性以使两个信号同时向不同方向移动?
  • 为什么要双向移动两个信号?以相反的方向移动两个信号与移动一个信号两倍的速度相同。因此,如果您使用相关性找到时移,则必须将其除以 2,才能找到您的时移。但也许它有助于更​​完整地解释你的问题。你最终想达到什么目标?你能提供你正在使用的真实信号吗?
  • @S Geurts x_sig_main_a 和 x_sig_main_b 表示将在左耳和右耳和combining the signals will give a binaural beat 中播放的内容。这些信号是非常大的音频信号,因此无法发布 100 meg + 文件。如果给定 RMSECorrelation value
猜你喜欢
  • 2020-08-02
  • 1970-01-01
  • 2014-03-06
  • 2018-05-30
  • 1970-01-01
  • 2015-03-26
  • 1970-01-01
  • 2021-05-15
  • 1970-01-01
相关资源
最近更新 更多