
1.首先建立信号模型并采样
%谐波分析仿真数据生成 CreatData.m
clc
fs=3000f0=50
N=1024
n=1:N
t=(n-1)/fs
m=13
Am=[380.4 0 2.035 0 3.156 0 1.042 0 4.291 0 16.13 0 2.016 ]
PH=[0 0 60 0 135 0 157.5 0 0 0 60 0 0]
x=zeros(1,N)
for k=1 : m
x=x+Am(k)*cos(2*pi*f0*k*t+PH(k)/180*pi)
end
figure(1)
plot(x)
2.进行FFT谐波分析
%直接用FFT进行谐波计算 Harmonic_Analysis.m
N=length(x)
f=50
m=13
n=1:N
Fn=zeros(9,3)% 谐波频率
An=zeros(9,3)% 幅值
Pn=zeros(9,3)% 初相角
for i=1 : m
Fn(i,1) = iFn(i,2) = f * i
An(i,1) = iAn(i,2) = 0
Pn(i,1) = iPn(i,2) = 0
end
fsN=fs/N
f0=50
%1-FFT
X=fft(x)
X=X(1:N/2)
Xabs=abs(X)
for i= 1 : m
[Amax,index]=TriFind(Xabs,floor((i*f0-15)/fsN),ceil((i*f0+15)/fsN))
if(index==-1)
Fn(i,3) = 0
An(i,3) = 0
Pn(i,3) = 0
else
if(Xabs(index-1) >Xabs(index+1))
a1 = Xabs(index-1) / Xabs(index)
r1 = 1/(1+a1)
k01 = index -1
else
a1 = Xabs(index) / Xabs(index+1)
r1 = 1/(1+a1)
k01 = index
end
Fn(i,3) = (k01+r1-1)*fs/N
An(i,3) = 2*pi*r1*Xabs(k01)/(N*sin(r1*pi))
Pn(i,3) = phase(X(k01))-pi*r1
Pn(i,3) = Pn(i,3)*180/pi
Pn(i,3) = mod(Pn(i,3),180)
end
end
Fn
An
Pn
figure(2)
stem(Xabs(1:N/2)*2/N)
dlmwrite('An.txt',An,'delimiter', '\t','precision', '%.10f','newline', 'pc')
dlmwrite('Fn.txt',Fn,'delimiter', '\t','precision', '%.10f','newline', 'pc')
dlmwrite('Pn.txt',Pn,'delimiter', '\t','precision', '%.10f','newline', 'pc')
3.完全手打的,先运行CreatData.m,再运行Harmonic_Analysis.m,应该可行,有问题再补充
4.少了个函数文件
新建个.m,命名为 TriFind,将以下内容粘贴
function [ Amax,index ] = TriFind(A,first,last)
%TRIFIND find x[k] if x[k-1]<x[k] and x[k]>x[k+1]
% return x[k] and the k
Amax=0
index=-1
for k=first+1:last-1
if A(k-1)<A(k) &&A(k)>A(k+1)
Amax=A(k)
index=k
end
end
在当前很多的电力产品中,带谐波(2~n次谐波电压电流含有率、有效值、总畸变率)计算功能的电力产品越来越多,系统因设计不同而采取不同算法。本文针对ARM9应用计算谐波,介绍笔者采用过的几种谐波算法。(以下提到的算法均不是笔者自创的)。
笔者采用过三种谐波算法,性能和特点大有差异。
1.三角函数算法:
三角函数算法是一种相对较简单,也较于容易理解的算法。计算原理如下所示:
从上面的公式中可以看出,算法需要大量计算三角函数,如果谐波次数越高,计算量则越大。而三角函数如果采用库函数的话,计算量是相当大的,这对于ARM9来说也是相当吃力的。当然可以采用查表方法,但这是牺牲空间换取时间,而且如果要求精度稍高点,则浪费空间越大。
笔者先接触谐波计算的时候,就是采用的这种算法,就19次谐波计算,CPU使用率达到了40%左右。
2.FFT算法:
针对三角函数算法在性能上稍有不足,笔者通过网上搜索,找到了两种比较高效谐波算法。
一种是任意点的混合基FFT算法:mix_fft:
mix_fft是一种任意点的谐波算法,所以对于采样点不是2n的应用是十分方便,而且最重要的是速度很快,对于目前市场上的ARM9来说,足够了。
mix_fft是个好用的FFT算法,但它不是开源的,所以应用时需要注意点。
另一种是ooura_fft:
ooura_fft是一种非常复杂但却是最高效的FFT算法,其速率在相同硬件条件下比mix_fft还快,特别是谐波采样点说越高的时候。ooura_fft只能计算2n的谐波采样点。故应用时也要注意这点。
对于上面两种FFT算法,都是用C语言写的,所以在其它应用场合也适用。使用的时候非常简单,只需要调用一个函数即可。如mix_fft算法应用如下:
其中,HarOriginalData存储谐波电压电流的采样数据。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)