|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?我要加入
x
下面是我在王兆华老师的FFT/apFFT矫正程序的基础上,写的关于模拟电力谐波的分析程序,由于我信号处理方面的知识很少,所以还有很多不理解的地方,请王老师和各位高手帮我解决一下。
close all;clc;clear all;
N=1024;%现在固定在个数据点数
f11=51.1;
Fs=2500;
n=-N+1:N-1;
apl=[220.5,4.4,10,3,6,1,3,0.8,1.5,0.8,1.1,0.04,0.85,0.1,1,0.04,0.5,0.02,0.3,0.005,0.01];
phol=[10,35,80.5,123,76,146,97,56,30,15,26,12,10,15,25,20,73,85,160,20,42];
%phol=zeros(1,21);%如果相位全选为0,则相位矫正结果全为270
ci=21;
y=zeros(1,2*N-1);
xie_bo=zeros(1,21);
for i=1:ci
y=y+apl(i)*sin(2*pi*i*f11*n/Fs+phol(i)*pi/180);%各次谐波叠加 i*f11
xie_bo(i)=i*f11;%计算谐波频率
end
%先进行传统的FFT
y1 = y(N:2*N-1);
win = hanning(N)';
win1 = win/sum(win); %窗归一 用于把加权求和的窗进行归一化
y11 = y1.*win1;
y11_fft = fft(y11,N);%做N点的FFT运算
a1 = abs(y11_fft); %FFT振幅谱
p1 = mod(phase(y11_fft)*180/pi,360); %FFT相位谱 angle(v)也可以求
%再进行apFFT进行运算
y2 = y(1:2*N-1); %2N-1个输入数据
win = hanning(N)';
winn = conv(win,win); %apFFT须要卷积窗
win2 = winn/sum(winn); %窗归一
y22 = y2.*win2;
y222 = y22(N:end)+[0 y22(1:N-1)]; %构成长N的apFFT输入数据 求和
y2_fft = fft(y222,N);
a2 = abs(y2_fft); %apFFT振幅谱
p2 = mod(phase(y2_fft)*180/pi,360);
%校正量的计算
ee = mod((p1-p2)/180/(1-1/N),1); %频率偏离矫正值
aa = (a1.^2)./a2*2; %振幅校正值 为什么要乘以2
subplot(5,1,1);stem(a1,'.');title('FFT amplitude spectrum');ylim([0,1]);xlim([0 N/2]); grid
subplot(5,1,2);stem(a2,'.');title('apFFT amplitude spectrum');ylim([0,110]);xlim([0 N/2]); grid
subplot(5,1,3);stem(p2,'.');title('apFFT phase spectrum');ylim([0,400]);xlim([0 N/2]); grid
subplot(5,1,4);stem(ee,'.');title('frequency correction spectrum');ylim([-1,1]);xlim([0 N/2]); grid
subplot(5,1,5);stem(aa,'.');title('amplitude correction spectrum');ylim([0,420]);xlim([0 N/2]); grid
xie_bo
r=round(xie_bo*N/Fs)%求谱线个数
disp('相位校正值')
p2(r+1)
disp('频率校正值')
(ee(r+1)+floor(xie_bo*N/Fs))*Fs/N %
disp('振幅校正值')
aa(r+1)
得到的结果如下:
xie_bo =
1.0e+003 *
Columns 1 through 9
0.0511 0.1022 0.1533 0.2044 0.2555 0.3066 0.3577 0.4088 0.4599
Columns 10 through 18
0.5110 0.5621 0.6132 0.6643 0.7154 0.7665 0.8176 0.8687 0.9198
Columns 19 through 21
0.9709 1.0220 1.0731
r =
Columns 1 through 16
21 42 63 84 105 126 147 167 188 209 230 251 272 293 314 335
Columns 17 through 21
356 377 398 419 440
相位校正值
ans =
Columns 1 through 9
280.0000 305.0000 350.5000 33.0000 346.0000 56.0000 7.0000 326.0000 300.0000
Columns 10 through 18
285.0000 296.0000 282.0000 280.0000 285.0000 295.0000 290.0000 343.0000 355.0000
Columns 19 through 21
70.0000 290.0000 312.0000
频率校正值
ans =
1.0e+003 *
Columns 1 through 9
0.0511 0.1022 0.1533 0.2044 0.2555 0.3066 0.3577 0.4088 0.4599
Columns 10 through 18
0.5110 0.5621 0.6132 0.6643 0.7154 0.7665 0.8176 0.8687 0.9198
Columns 19 through 21
0.9709 1.0220 1.0731
振幅校正值
ans =
Columns 1 through 9
220.5000 4.3962 9.9995 2.9997 5.9998 0.9998 2.9999 0.8001 1.5000
Columns 10 through 18
0.8000 1.1000 0.0400 0.8500 0.1000 1.0000 0.0400 0.5000 0.0200
Columns 19 through 21
0.3000 0.0050 0.0100
问题:
- a、程序中关于频率偏移量的计算ee = mod((p1-p2)/180/(1-1/N),1); 应该是按照书中P62页的公式(4-45)得到的,但是我从公式中推导的程序为ee=mod( ( (p1-p2)*pi/180 )*2/(n-1),1 );不知道这个对不对,王老师的表达式又是怎么得来的呢?另外,为什么是对1进行取余数呢,这个与频率分辨率有关系么?请王老、各位高手帮我解答一下,谢谢!
- b、程序中关于矫正结果的提取都用到了(r+1),这个是为什么呢,不应该是第r跟谱线的频率值,加上矫正量么?请王老、各位高手帮我解答一下,谢谢!
- c、从我的程序的结果可以看出,相位的矫正结果不对,我的不明白是为什么。如果把21个初始的相位全都定为0,则可到的相位矫正结果全是270,不知道该怎么改正,请王老、各位高手帮我解答一下,谢谢!
|
|