vincentsuen 发表于 2008-11-29 14:42

相干函数为什么计算出来恒等于1?

我在matlab中用mscohere计算频域的相干函数,直接将两个信号时程带入该命令,可是计算出来的相干函数恒等于1,命令如下:
= mscohere(xx5,xx4,hamming(np),0,np,sf);

为了对比,我又采用相干函数的定义来计算,即用互谱的平方除以两个自谱再开方,结果还是等于1:
=periodogram(xx5,hamming(np),np,sf,'onesided');
=periodogram(xx4,hamming(np),np,sf,'onesided');
=cpsd(xx5,xx4,hamming(np),0,np,sf,'onesided');
S54=abs(S54);
C54 =sqrt(S54.^2./(S55.*S44));


我在matlab专区发了帖子没人理我,只有在这里再发一遍。

hcharlie 发表于 2008-11-29 16:02

信号中没有干扰时相干函数=1

vincentsuen 发表于 2008-11-29 22:24

本帖最后由 VibInfo 于 2016-11-9 15:10 编辑

原帖由 hcharlie 于 2008-11-29 16:02 发表
信号中没有干扰时相干函数=1
相干函数表示的是两个随机过程的相关性,和干扰有什么关系?

hcharlie 发表于 2008-11-30 07:35

回复 板凳 vincentsuen 的帖子

你将xx5或xx4中加一点噪声再试试看。

songzy41 发表于 2008-11-30 11:33

把S54=abs(S54);去掉,而把
C54 =sqrt(S54.^2./(S55.*S44));
改为以下试试:
C54 =sqrt(S54.*conj(S54)/(S55.*S44));

[ 本帖最后由 songzy41 于 2008-11-30 15:15 编辑 ]

vincentsuen 发表于 2008-11-30 14:55

以下是这个问题的matlab代码:

clear;
clc;
fid4=fopen('input8(t).txt','r');
xx4=fscanf(fid4,'%f');
status=fclose(fid4);
fid5=fopen('input10(t).txt','r');
xx5=fscanf(fid5,'%f');
status=fclose(fid5);
sf=187.5; %采样频率
np=length(xx5);
t=1:1/sf:np/sf;
=periodogram(xx5,hamming(np),np,sf,'onesided');
=periodogram(xx4,hamming(np),np,sf,'onesided');
=cpsd(xx5,xx4,hamming(np),0,np,sf,'onesided');
S54=abs(S54);
C54 =sqrt(S54.^2./(S55.*S44));
% = mscohere(xx5,xx4,hamming(np),0,np,sf);

vincentsuen 发表于 2008-11-30 14:56

应该和这两个信号没有关系,换成其他的信号也是一样等于1。

vincentsuen 发表于 2008-11-30 14:58

本帖最后由 VibInfo 于 2016-11-9 15:10 编辑

原帖由 songzy41 于 2008-11-30 11:33 发表
把S54=abs(S54);去掉,而把
C54 =sqrt(S54.^2./(S55.*S44));
改为以下试试:
C54 =sqrt(S54.*conj(C54)/(S55.*S44));
改成这样:C54 =sqrt(S54.*conj(S54)./(S55.*S44));
还是一样的。

songzy41 发表于 2008-11-30 15:22

本帖最后由 VibInfo 于 2016-11-9 15:10 编辑

原帖由 vincentsuen 于 2008-11-30 14:58 发表


改成这样:C54 =sqrt(S54.*conj(S54)./(S55.*S44));
还是一样的。
我改成这样后,得到不完全是1,图如下:
%S54=abs(S54);
C54 =S54.*conj(S54)/(S55.*S44);

vincentsuen 发表于 2008-12-1 09:39

本帖最后由 VibInfo 于 2016-11-9 15:11 编辑

原帖由 songzy41 于 2008-11-30 15:22 发表

我改成这样后,得到不完全是1,图如下:
%S54=abs(S54);
C54 =S54.*conj(S54)/(S55.*S44);
这个表示什么意义啊?

songzy41 发表于 2008-12-1 15:31

抱歉,我上面给的不正确。是否应该用平均功率谱的概念?把程序改成这样:
np=1024;
S55=psd(xx5,np,sf,hamming(np),np/2);
S44=psd(xx4,np,sf,hamming(np),np/2);
=cpsd(xx5,xx4,hamming(np),np/2,np,sf,'onesided');
S54=abs(S54);
C54 =sqrt(S54.^2./(S55.*S44));

[ 本帖最后由 songzy41 于 2008-12-1 16:18 编辑 ]

w89986581 发表于 2008-12-1 18:30

回复 楼主 vincentsuen 的帖子

相关与相关有什么区别?有的书籍都是混为一谈的。

bkm1983 发表于 2009-3-17 10:01

你好vicentseun,我也碰到同样的问题 不知道你现在解决了没有啊 如果方便 麻烦加我qq 307688218 好向你当面请教 谢谢

TestGuru 发表于 2009-3-17 17:23

没仔细读以上程序,但估计相干函数在各频点恒为1的原因是整段数据只含一个FFT段的缘故。求相干函数必须将数据分为多个FFT段才有意义。

以下是用multi-instrument作相干分析的结果,下图的FFT点数与数据长度相等,为8192点,因此相干函数在各频点恒为1。


TestGuru 发表于 2009-3-17 17:27

下图的FFT点数为1024点,等于数据长度的1/8,可见相干函数并不恒为1,相干函数最大值为1,且正好位于两段数据皆含有的峰值频率处。(假定这两段数据的采样频率为44100HZ,经过频谱分析可得峰值频率为1722.7Hz)。


页: [1] 2 3
查看完整版本: 相干函数为什么计算出来恒等于1?