将1周期延拓12周期,APFFT分析出错!
本帖最后由 dsfire 于 2010-9-30 10:27 编辑采样频率是3200Hz,信号频率为50.4Hz。数据1是直接采样12个周期,进行APFFT/APFFT分析,分析结果没有问题;数据2是采样1周期,然后延拓为12周期,分析结果就出问题了,望赐教!
数据1分析结果:
校正的频率
50.400000 100.799993 151.200000 201.599977 252.000000 302.399976 352.800000 403.199984 453.600001
校正的相位
60.000000 45.004118 79.999996 42.006698 65.000015 119.997622 194.999960 284.989180 61.999874
校正的幅值
219.999997 0.600092 24.999998 0.500089 7.000001 0.400044 3.999997 0.299981 1.999991
数据2分析结果:
校正的频率
50.000000 100.000000 150.000000 200.000000 250.000000 300.000000 350.000000 400.000000 450.000000
校正的相位
55.580539 265.888827 67.087927 272.277699 40.707085 213.682722 176.251443 263.722936 10.007477
校正的幅值
NaN NaN NaN NaN NaN NaN NaN NaN NaN
运行数据1时将数据2注释掉,运行数据2时,将数据1注释掉。谢谢!
程序如下: (有附件)
clc;clear;clf;
close all;
format short;
Fs=3200; %采样频率
N=3200/50*4; %采样长度
t=(-N+1):(N*2-1);
f0=50.4; %数据频率
ff=;
Ph=;
A= ;
CNum=length(A);
s=zeros(1,length(t));
% *******运行数据1的时候将数据2注释掉,运行数据2的时候将数据1注释掉****
%
% 数据1 没有问题,但数据2分析的就出现问题了!频率不是50Hz时(50.4),数据2分析时仍然是50Hz,相位和幅值也不对,望赐教
% 数据1
% % % % % % % % % % 数据1:直接采样12个周期,其值在s里面% % % % % % % % % % % % % % %
% for i=1:CNum
% myt=A(i)*cos(2*pi*ff(i)*t/Fs+Ph(i)*pi/180);
% s=s+myt;
% end
% % % % % % % % % % % % % % % 数据1 构造结束% % % % % % % % % % % % % % % % % % %
% figure(1);plot(s);
% 数据2
% % % % % % % % % % 数据2:先采样一个周期,再延拓为12个周期,其值在s里面 % % % % % % %
%先采样一个周期数据
N=64;
t=0:N-1;
s2=zeros(1,length(t));
for i=1:CNum
myt=A(i)*cos(2*pi*ff(i)*t/Fs+Ph(i)*pi/180);
s2=s2+myt;
end
N=3200/50*4;
% 开始延拓为12个周期
for i=1:3*N-1
if(i <=64)
s(i) = s2(i);
else
s(i) = s(i-64);
end
end
% figure(2);plot(s);
% % % % % % % % % % %% % % % 数据2 构造结束 % % % % % % % % % % % % % % % % % %
% % % % % % % % % % % % 以下开始对s进行分析
N=fix((length(s)+1)/3);
s=s(1:3*N-1);
win=hann(N)';
win1=hanning(N)';
win2=conv(win,win1);
win2=win2/sum(win2);
s1=s(1:2*N-1);
y1=s1.*win2;
y1a=y1(N:end)+;
F1=fft(y1a,N);
s2=s(1+N:3*N-1);
y2=s2.*win2;
y2a=y2(N:end)+;
F2=fft(y2a,N);
a1=abs(F1);
L=fix(N/2)+1;
f=(0:L)*Fs/N;
i=0;
for I=2:length(a1)/2-1;
k=I;
if ( (a1(k)>a1(k-1)) & (a1(k)>a1(k+1)) );
= apFFT_Corret(k,F2(k),F1(k),N);%%%aPFFT_Correct函数在下面
if i<9 %只显示前9次谐波
i=i+1;
fff(i)=aaa;
AA(i)=bbb;
PH(i)=ccc;
Ind(i)=k;
end
end
end
num=length(Ind);%%%%%设置所取的“谐波簇”个数
% disp('校正的频率')
fm=*Fs/N;
% disp('校正的相位')
PH=mod(PH*180/pi,360);
disp('校正的频率')
fprintf('%05.6f\t',fm);
fprintf('\n');
disp('校正的相位')
fprintf('%05.6f\t',PH);
fprintf('\n');
disp('校正的幅值')
fprintf('%05.6f\t',AA);
fprintf('\n');
function = apFFT_Corret(k0,F2,F1,N)
dph=angle(F2)-angle(F1);
dph=mod(dph,2*pi);
if dph>pi
dph=dph-2*pi;
elseif dph<-pi
dph=dph+2*pi;
end
dk=dph/pi/2;
g=dk;
h=2*pi*g.*(1-g.*g)./sin(pi*g);
AA=abs((h.^2).*F1)/2;
fff=(k0+dk-1);
PH=angle(F1);
回复楼主dsfire的帖子
本帖最后由 zhwang554 于 2010-9-30 22:44 编辑观察数据1 和数据2 , 数据1在f0=50.4时不是以64为周期的信号, 和数据2不同,所以apfft后数据1结果正确, 数据2不正确数据1145.3200116.0112 85.4938 55.9640 28.7347 3.8960-19.2539-41.2885-61.9095-79.9657-94.2809 -104.7330 -112.7784 -120.9503 -131.5509 -145.3389 -161.0627 -176.1630 -188.2142 -196.2100-200.9300 -204.2408 -207.8642 -212.4107 -217.2039 -220.8300 -221.8919 -219.4248 -212.8167 -201.5215-185.0025 -163.0901 -136.5003 -107.0217-77.0545-48.6724-22.7923 0.9536 23.5133 45.348965.789083.3247 96.7120106.1295113.5288121.8149133.2849 148.2866 164.9649180.2815191.6900198.4483 201.8150204.1087207.2945211.9703217.2543 221.4378 222.8261220.2158212.8688200.2771 182.1253158.5921130.7331100.5113 70.260341.8129 15.8548 -8.0233-30.5794-51.9982-71.4882 -87.7475 -100.0176 -108.9734 -116.7456 -125.9362 -138.1903 -153.2291-168.9844 -182.7717 -192.7715 -198.9112 -202.6617 -205.9714 -210.0744 -214.8955 -219.2872 -221.7618-221.1230 -216.6189 -207.7015 -193.8094 -174.5272 -150.0794 -121.7417-91.7114-62.3495-35.2121数据2115.0483 84.5312 55.0607 27.9119 3.1395-19.9694-41.9692-62.5295-80.4820-94.6685-105.0137 -113.0215 -121.2404 -131.9411 -145.8197 -161.5665 -176.6025 -188.5306 -196.4020 -201.0459-204.3442 -207.9948 -212.5655 -217.3451 -220.9095 -221.8717 -219.2814 -212.5332 -201.0798 -184.3888-162.3111 -135.5969 -106.0649-76.1207-47.8113-22.0103 1.6832 24.2180 46.0259 66.399083.817297.0660 106.3811113.7627122.1222133.7114148.8050165.4886180.7132191.9741198.5964201.8916 204.1888207.4212212.1366217.4138221.5327222.8096220.0584 2 12.5520199.7871181.4579 157.7659129.7977115.048384.5312 55.0607 27.9119 3.1395-19.9694-41.9692-62.5295 -80.4820-94.6685 -105.0137 -113.0215 -121.2404 -131.9411 -145.8197 -161.5665-176.6025 -188.5306 -196.4020 -201.0459 -204.3442 -207.9948 -212.5655 -217.3451 -220.9095 -221.8717-219.2814 -212.5332 -201.0798 -184.3888 -162.3111 -135.5969 -106.0649-76.120747.8113 -22.0103数据1在f0=50.0时是以64为周期的信号, 和数据2相同,这时apfft后数据1结果正确, 数据2也正确 本帖最后由 dsfire 于 2010-10-7 12:36 编辑
多谢老师解答,十一刚回来,不好意思。对于这种不是整周期截断的,延拓比较困难些。若只想要正确的求出各次谐波的幅值,这个有没有可行的方法呢?
页:
[1]