【发布时间】: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