Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab 如何直接计算信号的期望相移?_Matlab_Fft_Octave_Combinatorics_Algebraic Data Types - Fatal编程技术网

Matlab 如何直接计算信号的期望相移?

Matlab 如何直接计算信号的期望相移?,matlab,fft,octave,combinatorics,algebraic-data-types,Matlab,Fft,Octave,Combinatorics,Algebraic Data Types,我将两个组合相移信号(x_phase_sig_comb)与给定信号(x_给定)进行比较。 目前我正在使用for循环将每个组合相移信号(x_phase_sig_comb)相加,然后计算给定信号(x_给定)的RMSE(均方根误差)值,然后将每个值放入一个数组中,然后对最小的RMSE(均方根误差值)进行排序 是否有一种代数方法直接计算相移,当与给定信号(x_给定)相比较时,2个组合相移信号(x_phase_sig_comb)将具有最小、最大或选定的RMS(均方根误差)范围。我试图避免计算每个组合相移信

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

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

我问这个问题的原因是,我有非常大的信号,在每个信号之间循环需要相当长的时间。使用某种类型的代数“形式”直接计算相对于(给定x_)的最小、最大或一定范围的RMSE值的相移将节省大量时间。我只是不知道如何限制相移信号的频率和振幅,或者如何用代数方法来实现。有什么想法吗

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

Ps:我使用的是类似于matlab的倍频程4.0 请参见下面的示例代码

%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
是否有一种代数方法直接计算相移,当与给定信号(x_给定)相比较时,2个组合相移信号(x_phase_sig_comb)将具有最小、最大或选定的RMS(均方根误差)范围。我试图避免计算每个组合相移信号(x_phase_sig_comb)


我问这个问题的原因是,我有非常大的信号,在每个信号之间循环需要相当长的时间。使用某种类型的代数“形式”直接计算相对于(给定x_)的最小、最大或一定范围的RMSE值的相移将节省大量时间。我只是不知道如何限制相移信号的频率和振幅,或者如何用代数方法来实现。有什么想法吗?

也许你可以用相关性代替RMS

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

关于去功能的文档

我知道您有两个信号,一个“给定”信号和一个“主”信号,并且您试图以某种方式匹配给定信号,使其尽可能接近主信号(RMS意义上)。但是,为什么要通过
+rr
-rr
采样来延迟主信号,并将它们相加,然后与给定信号进行比较?此外,您正在使用短语“相移”来表示“相移”。相移信号将其乘以exp(j*phi),但您的代码只是延迟。那么,是相移还是延迟呢?你是什么?你说的是互相关吗?@Ahmed Fasih这是一个相移see视频,解释了相移+rr和-rr表示左耳和右耳播放的内容,组合这些信号将产生双耳节拍。@RickT:你链接的视频只显示频率相同的窦性信号。如果只有一个频率,则延迟的效果与相移的效果相同。正如艾哈迈德已经说过的,当你有多个频率时(就像你上面的例子),恒定的时间延迟和相移是不同的。我猜你想计算两个信号之间的时间延迟,直到“匹配”。这可以使用互相关(见S Geurts答案)@Andy谢谢你的帮助,它会起作用,除了在相关中一个信号不会“移动”请看视频,但我的两个信号同时在相反的“方向”移动
x_sig_main_a=circshift(x(:),rr)%向右移位信号
x_sig_main_b=circshift(x(:),-rr)%向左移动信号。是否可以调整相关性,使两个信号同时向不同方向移动?这只是将“RMS”替换为“相关性”。主要问题是,我仍然必须将每个组合相移信号(x_phase_sig_comb)相加,然后如果不使用RMSE,则计算使用相关性。原因是我有非常大的信号,在每个信号之间循环需要相当长的时间。使用某种类型的代数“形式”直接计算相移,它将给出相对于(给定x_)的最小、最大或一个范围的RMSE/相关值,这将节省大量时间。相关取代循环,因此不需要循环。相关性的最大值对应于两个信号最匹配的特定时间偏移(我在提案中更改了一些变量名称以使其更清晰)。当你现在使用主频时,你可以从时移计算相位。@S Geurts谢谢你的帮助,它会起作用,除了在相关中一个信号不会“移动”请看视频,但我的信号同时都在相反的“方向”移动
x_sig_main_a=circhshift(x(:),rr)%向右移位信号
x_sig_main_b=circshift(x(:),-rr)%向左移动信号。可以调整相关性使两个信号同时向不同方向移动吗?为什么要同时向两个方向移动两个信号?以相反方向移动两个信号与以两倍的速度移动一个信号相同。所以,如果你用相关性找到一个时间偏移,你必须把它除以2,才能找到你的时间偏移