Flux中整周期(Full period)FFT算法的研究
本帖最后由 dnawujun 于 2016-2-26 18:44 编辑N为我们选择的数据的点数(包含整个周期),N1为Flux自动选的FFT点数
并且N1<=N-1
Flux按如下过程做FFT
1. 取N1为小于并最靠近N-1的,为2的幂的那个数
比如:
N-1=64,则取N1=64
N-1=200,则取N1=128
2. 如果N1=N-1,则直接做N-1个点数据的FFT
3. 如果N1!=N-1,则在原始数据上按N1+1个点做线性插值,然后
在插值后的数据上做N1个点的FFT
因FFT能解析的最高谐波次数为N1/2-1,所以即便是仿真了100个点的数据
而这时Flux取N1=64,则最高谐波次数为31,所以即便在FFT对话框里的
"Number of harmonics compute"输入1000,Flux也只输出31个谐波数据(不含直流分量的情况下)。
用matlab写程序对比一下结果
Matlab源代码
%输入数据为t,y, workspace中的
%t为时间,列向量
%y为数据值(电流、电压等),列向量
N=length(t);
%取小于并最靠近N-1的,为2的幂的那个数
N1=2^(nextpow2(N-1)-1);%也可以用2^floor(log2(N-1))
if N1~=(N-1)
t1=linspace(t(1),t(end),N1+1)';
Fs=1/(t1(2)-t1(1));%采样频率
y1=interp1(t,y,t1);%按N1+1个点线性插值
y_fft=fft(y1,N1);%按N1个点做fft
else %直接做fft
Fs=1/(t(2)-t(1));%采样频率
y_fft=fft(y);
End
%实际幅值需要除以N1/2
amps=abs(y_fft)/(N1/2);
%实际直流分量只需要除以N1
amps(1)=amps(1)/2;
%因FFT结果是对称的,所以只需要前半部分
amps=amps(1:N1/2);
%相位
angles=angle(y_fft);
angles=angles(1:N1/2);
%各次谐波的频率
n=(1:N1/2)';
freqs=(n-1)*Fs/N1;
是的 FFT的次数除了设定值外,还受限于原始数据点数 赞,吴兄威武!! 谢谢楼主的分享 不错
页:
[1]