1 信号间的相互关系
1.2 新的信号间运算类
classdef CSigCalc<handle
% relation between two signals
%
properties
m_sig1;
m_sig2;
end
methods
function obj = CSigCalc(sig1, sig2)
dFs1 = sig1.m_dFs;
dFs2 = sig2.m_dFs;
% 判断两信号的采样率一致
if abs(dFs1 - dFs2) < eps
obj.m_sig1 = sig1;
obj.m_sig2 = sig2;
else
disp('Sample frequency of the two signals are not equal.')
disp('Signal object is not constructed.')
return;
end
end
function relat = Relation(obj)
% 计算相关系数
vecSig1 = obj.m_sig1.m_vecSig;
[~, colNum] = size(vecSig1);
if colNum == 1 % to be sure the row vector
vecSig1 = vecSig1';
end
vecSig2 = obj.m_sig2.m_vecSig;
[~, colNum] = size(vecSig2);
if colNum == 1 % to be sure the row vector
vecSig2 = vecSig2';
end
if length(vecSig1) > length(vecSig2)
vecSig1 = vecSig1(1:length(vecSig2));
elseif length(vecSig1) < length(vecSig2)
vecSig2 = vecSig2(1:length(vecSig1));
else
end
relat = (vecSig1*vecSig2')/...
sqrt(vecSig1*vecSig1')/sqrt(vecSig2*vecSig2');
end
function Disp2SigCurve(obj)
Fs = obj.m_sig1.m_dFs;
vecSig1 = obj.m_sig1.m_vecSig;
vecT1 = (0:length(vecSig1)-1)/Fs;
vecSig2 = obj.m_sig2.m_vecSig;
vecT2 = (0:length(vecSig2)-1)/Fs;
figure;
plot(vecT1,vecSig1,vecT2,vecSig2,'linewidth',2)
xlabel('时间 S')
ylabel('幅值')
legend('1','2')
end
function [vecRelFunc, vecLags] = RelatFunc(obj)
strArrScaleOpt = {'biased','unbiased','coeff','none'};
ind = 3;
dFs = obj.m_sig1.m_dFs;
[vecRelFunc, vecLags] = xcorr(obj.m_sig1.m_vecSig, obj.m_sig2.m_vecSig,strArrScaleOpt{ind});
vecLags = vecLags/dFs;
figure;
plot(vecLags, vecRelFunc)
title(strArrScaleOpt{ind})
grid;
[~,indexMax] = max(vecRelFunc);
disp(['Time lag = ' num2str(vecLags(indexMax))])
end
end
end
1.2 脚本程序
% Exer_SigProcess_Script.m
close all;
strCurrentPath = cd;
addpath([strCurrentPath '\classdef']);
% 构造信号1,sig1
vecAmp=[1 3 5 7];
vecFreq = [0.25 2 3 4];
vecPhi = [0 pi/3 pi/4 pi/2];
Fs = 2^10;
t = 0:1/Fs:2*pi;
ind = 1;
xt = vecAmp(ind)*cos(2*pi*vecFreq(ind)*t + vecPhi(ind));
sig1 = CSignal(Fs, xt);
xt = vecAmp(ind)*cos(2*pi*vecFreq(ind)*t + vecPhi(4));
sig2 = CSignal(Fs, xt);
sigCalc = CSigCalc(sig1,sig2);
relat = sigCalc.Relation;
disp(['relat = ' num2str(relat)])
Disp2SigCurve(sigCalc);
rmpath([strCurrentPath '\classdef']);