全相位fft matlab,全相位FFT问题——全相位时移相位差法 请教!!!

最近学习王兆华教授的全相位FFT方面的知识,对于全相位时移相位差法有点疑问,望高手们解答。

全相位时移相位差法的采样长度为3N-1,倘若将其分为三段:1~N、N+1~2N-1、2N~3N-1,来模拟一下实际采样中噪声干扰可能带来的偏差。

设定三段的频率、相位相同,但是幅值取不同值(保证了频谱的连续性),然后按照附录3的原理性程序做全相位FFT,并对最后的结果分析:

结果的频率和相位没什么好说的,主要是结果中幅值一项基本就等于前两段数据(1~N、N+1~2N-1)理论幅值的平均值,而第三段数据(2N~3N-1)幅值的变化对结果基本没什么大的影响。换句话说,全相位时移相位差法所得的结果基本等于前两段数据FFT的平均值,而几乎与第三段无关,这是为什么???而平常FFT做例如10个周波的FFT,那么结果一定等于各个周波FFT的平均值(已证明)。那么全相位第三段数据(2N~3N-1)的突然跳变会对全相位结果无太大的影响,求解释?!!

实验代码如下:

%附3 apFFT时移相位差法校正程序

close all;clear all;clc;

N=1024;

FSX=5;

fs=FSX*N;

t1=-N+1:0;

t2=1:N-1;

t3=N:2*N-1;

f=50;

ph=90;

A1=120;A2=60;A3=10000;%试图改变A1、A2、A3的值...

s1=A1*cos(2*pi*t1*f/fs+ph*pi/180);

s2=A2*cos(2*pi*t2*f/fs+ph*pi/180);

s3=A3*cos(2*pi*t3*f/fs+ph*pi/180);

ss=[s1,s2,s3];

win=hanning(N)';win1=hann(N)';

win2=conv(win,win1);

win2=win2/sum(win2);

w=pi*2;

s1=ss(1:2*N-1); %第1组(2N-1)个数据

y1=s1.*win2;

y1a=y1(N:end)+[0 y1(1:N-1)];

out1=fft(y1a,N);

a1=abs(out1);

p1=mod(phase(out1),2*pi);

s2=ss(1+N:3*N-1); %第2组(2N-1)个数据

y2=s2.*win2;

y2a=y2(N:end)+[0 y2(1:N-1)];

out2=fft(y2a,N);

a2=abs(out2);

p2=mod(phase(out2),2*pi);

rr=round(f/FSX);

dp=p2(rr+1)-p1(rr+1);

dph=mod(dp,2*pi); %由于频率较小,为减小噪声信号的干扰,作如下改进频率和幅值

if dph>pi %dph即为两序列谱峰线间的相位差,(0~2*pi)

dph=dph-2*pi;

elseif dph

dph=dph+2*pi;

end

g0=dph/pi/2;

if g0==0

h=2;

else h=2*pi*g0.*(1-g0.*g0)./sin(pi*g0);

end

AA=abs((h.^2).*a1)/2;

fff=(rr+g0)*FSX

aaa=AA(rr+1)

ppp=p1(rr+1)*180/pi

结果:fff =  50.0251        aaa =  90.0058           ppp =  89.5443

即幅值aaa为前两段数据幅值(120、60)的平均值,改变其他数据同理。我想知道,第三段数据干什么去了???

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以为您解答这个问题。不过在计算所有图片的相位差之前,首先需要明确一下您的图片格式和相位差的计算方。 如果您的图片是二维图像,可以使用Matlabfft2函数进行傅里叶变换,然后计算每个像素点的相位。具体代码如下: ``` img1 = imread('image1.jpg'); % 读取第一张图片 img2 = imread('image2.jpg'); % 读取第二张图片 fft1 = fft2(img1); % 对第一张图片进行傅里叶变换 fft2 = fft2(img2); % 对第二张图片进行傅里叶变换 phase_diff = angle(fft2 ./ fft1); % 计算相位差 ``` 上述代码中,使用angle函数计算两张图片傅里叶变换后的相位差,并将结果保存在phase_diff变量中。 如果您的图片是三维图像(如视频序列),可以使用Matlabfft函数进行傅里叶变换,然后计算每个像素点的相位。具体代码如下: ``` vid = VideoReader('video.mp4'); % 读取视频文件 n_frames = vid.NumFrames; % 获取视频帧数 fft1 = fft(read(vid, 1), [], 3); % 对第一帧进行傅里叶变换 phase_diff = zeros(size(fft1, 1), size(fft1, 2), n_frames-1); % 初始化相位差矩阵 for i = 2:n_frames fft2 = fft(read(vid, i), [], 3); % 对当前帧进行傅里叶变换 phase_diff(:, :, i-1) = angle(fft2 ./ fft1); % 计算相位差 fft1 = fft2; % 将当前帧作为下一次计算的参考帧 end ``` 上述代码中,使用fft函数对视频序列中的每一帧进行傅里叶变换,并计算相邻帧之间的相位差。最终结果保存在phase_diff变量中。 希望以上代码能够对您有所帮助。如果您还有其他问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值