dnawujun 发表于 2016-2-26 15:16

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;

e=mc^2 发表于 2016-2-28 18:35

是的 FFT的次数除了设定值外,还受限于原始数据点数

flyingmind 发表于 2016-3-22 08:56

赞,吴兄威武!!

自由落体猫 发表于 2016-3-22 09:41

谢谢楼主的分享 不错
页: [1]
查看完整版本: Flux中整周期(Full period)FFT算法的研究