声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 4125|回复: 7

[FFT] 互功率谱与互相关函数的一个编程问题

[复制链接]
发表于 2007-1-28 19:41 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
以下是我作的,遇到困难了,请大家帮忙解决一下。求两个信号序列的互相关函数,4.txt和6.txt中第二列是实测信号序列,第一列为采样时间。我按照一本书所说的,先求出两者的互功率谱,然后进行傅立叶逆变换,取傅立叶变换的实部为互相关函数,结果如下图所示。我感觉和预想的结果不一样。下面是用的程序,是不是建立负频率段的互功率谱错了,还是其他的地方出错了,请高手帮忙。万分感激!急用!!!
clc
clear
data1=load('4.txt');
data2=load('6.txt');
x=data1(:,2)';
y=data2(:,2)';
np=length(x);
fs=1000;
nfft=1024;
t=0:1/fs:(np-1)/fs;
Pxy=CSD(x,y,nfft,fs,[]);  %计算互功率谱
Pxy(nfft/2+1)=real(Pxy(nfft/2));  %建立负频率段的互功率谱
Pxy(nfft/2+2:nfft)=conj(Pxy(nfft/2:-1:2));
g=ifft(Pxy);    %傅立叶逆变换
g=ifft(Pxy);    %取傅立叶变换的实部为互相关函数
r=real(g(1:np));%绘制互相关函数时程曲线图
plot(t,r);
grid;

[ 本帖最后由 zhangnan3509 于 2007-6-5 17:19 编辑 ]

互相关函数时程曲线图

互相关函数时程曲线图

4.txt

24.44 KB, 下载次数: 94

信号1

6.txt

24.44 KB, 下载次数: 64

信号2

回复
分享到:

使用道具 举报

 楼主| 发表于 2007-1-28 19:44 | 显示全部楼层

回复 #1 yangcui 的帖子

上面的程序贴错了,应该是下面的这个。
clc
clear
data1=load('4.txt');
data2=load('6.txt');
x=data1(:,2)';
y=data2(:,2)';
np=length(x);
fs=1000;
nfft=1024;
t=0:1/fs:(np-1)/fs;

Pxy=CSD(x,y,nfft,fs,[]);  %计算互功率谱
Pxy(nfft/2+1)=real(Pxy(nfft/2));  %建立负频率段的互功率谱
Pxy(nfft/2+2:nfft)=conj(Pxy(nfft/2:-1:2));
g=ifft(Pxy);    %傅立叶逆变换
g=real(ifft(Pxy));    %取傅立叶变换的实部为互相关函数
r=g(1:np);%绘制互相关函数时程曲线图
plot(t,r);
grid;
发表于 2007-1-29 20:22 | 显示全部楼层
x和y的互相关函数应有2001个数据,很明显没法从CSD得到。
 楼主| 发表于 2007-1-29 22:46 | 显示全部楼层
songzy41,您好!能具体指点一下吗?
在什么条件下能从CSD得到?
我如果按下面的步骤作,能行吗?
1、将x,y长度通过增加零值延长到2001;
2、利用FFT计算x和y各自2001点的DFT:X(k)和Y(k);
3、计算R(k)=X(k)Y‘(k),其中Y‘(k)为Y(k)的共轭;
4、利用IFFT计算R(k)得到x,y的互相关函数。
 楼主| 发表于 2007-1-29 22:51 | 显示全部楼层
songzy41,您好!能具体指点一下吗?
在什么条件下能从CSD得到?
我如果按下面的步骤作,能行吗?
1、将x,y长度通过增加零值延长到2001;
2、利用FFT计算x和y各自2001点的DFT:X(k)和Y(k);
3、计算R(k)=X(k)Y‘(k),其中Y‘(k)为Y(k)的共轭;
4、利用IFFT计算R(k)得到x,y的互相关函数。
发表于 2007-1-30 06:52 | 显示全部楼层
原帖由 yangcui 于 2007-1-29 22:51 发表
1、将x,y长度通过增加零值延长到2001;
2、利用FFT计算x和y各自2001点的DFT:X(k)和Y(k);
3、计算R(k)=X(k)Y‘(k),其中Y‘(k)为Y(k)的共轭;
4、利用IFFT计算R(k)得到x,y的互相关函数。

用这种方法可以求得互相关函数,但补零时要注意,x应在后面补零,y应在前面补零。程序如下:
clc; clear
data1=load('4.txt');
data2=load('6.txt');
x=data1(:,2)';
y=data2(:,2)';
np=length(x);
x=[x zeros(1,1000)];
y=[zeros(1,1000) y];
fs=1000;
X=fft(x);
Y=fft(y);
R=X.*conj(Y);
rxy=real(ifft(R));
t=(-np+1:np-1)/fs;
plot(t,rxy); grid;
得图有:

互相关函数图

互相关函数图
发表于 2012-10-12 20:45 | 显示全部楼层
x和y的互相关函数应有2001个数据,很明显没法从CSD得到。
请问x和y的互相关函数为什麽是2001个数据呢?而不是1001个数据呢??本人不是学信号的,但是现在要用到这个程序,学习下,问题比较初级,请帮忙回答一下,不甚感激。


补充内容 (2012-10-13 21:08):
还用csd函数,把楼主的程序改成如下:对不对呢???请赐教~~~~~不甚感激
clear
data1=load('4.txt');
data2=load('6.txt');
x=data1(:,2)';
y=data2(:,2)';
np=length(x);
fs=1000;
nfft=2^nextpow2(2*np);
t=0:1/fs:(np-1)/fs;
Pxy=CSD(x,y,nfft,fs,[]);  %计算互功率谱
Pxy(nfft/2+1)=real(Pxy(nfft/2));  %建立负频率段的互功率谱
Pxy(nfft/2+2:nfft)=conj(Pxy(nfft/2:-1:2));
g=ifft(Pxy);    %傅立叶逆变换
g=real(g(1:np));    %取傅立叶变换的实部为互相关函数
r=g(1:np);
plot(t,r);
grid;
发表于 2013-9-26 10:52 | 显示全部楼层
求指点。。。这两句具体怎么理解?
Pxy(nfft/2+1)=real(Pxy(nfft/2));  %建立负频率段的互功率谱
Pxy(nfft/2+2:nfft)=conj(Pxy(nfft/2:-1:2));
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-5-18 13:57 , Processed in 0.225713 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表