加窗相位差频率matlab,求助:关于相位差校正,加卷积窗函数

本帖最后由 芒果樱桃 于 2012-4-8 09:05 编辑

希望实现功能是通过加自卷积窗函数,获得正确的相位、频率和幅值

根据丁康的相位差校正,试着编了一个程序,将信号分成两段,然后分别加窗,通过相位差校正法求出信号信息,

不知程序这样写行不行,新手求解答

%相位差校正

clc

clear all

fs=1024;

N=1024;

M=N/2;

L=512;

t1=0:(N-1);  %序列一段长度

t2=0:(N+L-1);  %序列二段长度(本来是从L到L+N)

df=fs/N;%频谱分辨率

%信号函数

ph1=0.1;%相位1

ph3=0;%相位3

f1=50.2;

f3=99.8;

x=0.2+6*sin(2*pi*f1*t1/N+ph1*pi/180)+sin(2*pi*f3*t1/N+ph3*pi/180);

x2=0.2+6*sin(2*pi*f1*t2/N+0.1*pi/180)+sin(2*pi*f3*t2/N+ph3*pi/180);

%plot(linspace(0,pi,N),angle(fft(x,N)));

%原始信号函数的输出

X=fft(x);  %做FFT变换

Ayy=abs(X)/(N/2);  %取模,换算成实际的幅度

Ayy(1)=Ayy(1)/2;  %直流分量是(1),上句话多乘了2,所以这句要除以2

f=(1:N-1)*fs/N;  %换算成实际的频率值

for k=1:N/2

ph(k)=phase(X(k))*180/pi+90; %计算相位,换算为角度

end;

%加blackmanharris自卷积窗

window=blackmanharris(M)';

win=conv(window,window);  %blackmanharris窗函数的时域相乘,即为频域卷积

win1=ifft(fft(win,N));

win2=[zeros(1,length(x2)-N),win];%对窗函数补零,序列2段本来应该也是长度为N

win2=ifft(fft(win2,N+L));

X1=fft(x.*win1);  %信号1段加窗

A1=abs(X1);

Ph1=angle(X1)*180/pi+90;  %求相位

Ph1=[Ph1,zeros(1,L)];

X2=fft(x2.*win2);

A2=abs(X2)/(N/2);

Ph2=angle(X2)*180/pi+90;

dph=Ph2-Ph1;

delta=dph-2*pi*L/N;

delta=mod(delta,2*pi);

for k=1:round(f/df);%小数四舍五入,这里返回值是整数,k为谱线号

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

delta(k)=delta(k)-2*pi;

elseif delta(k)

delta(k)=delta(k)+2*pi;

end

end

dfy=(dph-2*pi*L*k/N)/(2*pi*L/N);

fconr=(k+dfy)*df;

sita=atan(imag(X)/real(X))+dfy;

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
离散频谱的比值校正法-频谱分析的校正方法.pdf 离散频谱的比值校正法 在下帖子中讨论了“Matlab中FFT求正玹序列的振幅”https://www.ilovematlab.cn/thread-50611-1-1.html 我在帖子中指出了当“正弦信号的频率不与FFT后的某条谱线相合”,可用校正法来求正弦信号的频率。在这里提供一个比值校正法的程序,它已编写成一个函数,该方法的理论可参看以下附件。 function Z=Specorr [nx,mx]=size; if mx==1, x=x';end [nx,mx]=size; if mx<N     x=[x zeros]; else     x=x; end w=hann; if method==2     xf=fft;     xf=xf/N*4;     WindowType=2; else     xf=fft;     xf=xf/N*2;     WindowType=1; end ddf=fs/N; n1=fix; n2=round;     A=abs;     [Amax,index]=max);     index=index n1-1;     phmax=angle);     %比值法     %矩形窗     if         indsecL=A>A;         df=indsecL.*A./)-.*A./);         Z=*ddf;         Z=Amax/sinc;         Z=;              end         %比值法     %Hanning窗     if         indsecL=A>A;         df=indsecL.*-Amax)./)-.*-Amax)./);         Z=*ddf;         Z=*Amax/sinc;         Z=;              end     Z=mod,2*pi);     Z=Z->pi)*pi; 调用格式是 Z=Specorr 其中输入变量 x     是被测信号   fs    采样频率 N    FFT的长度(相当于nfft) nx1,nx2   被测正弦信号频率的区间,nx2>nx1 method   窗函数的方法,1为矩形窗,2为海宁窗 输出变量Z,Z为被测信号的频率,Z为被测信号的幅值,Z为被测信号的初始相角 这里把https://www.ilovematlab.cn/thread-50611-1-1.html 帖子中1层的程序修改一下列于 Fs=1000; n=0:1/Fs:1; xn=10 15*sin randn); nfft=1024; Xn = fftshift); Xn=Xn/2; A=2*abs/Fs; subplot,plot subplot stem xlabel,ylabel P=Xn.*conj/nfft; xlim Z=Specorr 这样得到Z为 Z =    10.0003   15.0009    1.5693 信号频率为10.0003,幅值为15.0009,初始相角为1.5693。初始相角是以余弦信号为准,正弦信号正好差pi/2。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值