下面的FFT如何避免漏电

信息处理 fft
2022-02-17 23:52:43

我已经为一个信号编写了 FFT 代码,其时域图和 FFT 如下所示。

为了避免能量泄漏,我不确定要做什么 FFT 长度?

我知道数字周期必须是整数,但我看不出如何在此处实际实现此原理。

此外,我得到的幅度与时域信号中所写的 5 5 10 相差甚远。

我哪里做错了?

在此处输入图像描述

在此处输入图像描述

    clc
    clear all
    Fs=200e3;
    Ts=1/Fs;
    dt=0:Ts:5e-3-Ts;
    
    f1=1e3;
    f2=20e3;
    f3=30e3;
    
    y=5*sin(2*pi*f1*dt)+5*sin(2*pi*f2*dt)+5*sin(2*pi*f1*dt)+10*sin(2*pi*f3*dt);
    %plot(dt,y)
    nfft=length(y);
    nfft2=2.^nextpow2(nfft);
    fy=fft(y,nfft2);
    f_half=fy(1:(nfft2/2));
    xfft=Fs.*(0:nfft2/2-1)/nfft2;
    plot(xfft,abs(f_half));

固定决赛:

clc
clear all
Fs=200e3;
Ts=1/Fs;
dt=0:Ts:5e-3-Ts;

f1=1e3;
f2=20e3;
f3=30e3;

y=5*sin(2*pi*f1*dt)+5*sin(2*pi*f2*dt)+10*sin(2*pi*f3*dt);
%plot(dt,y)
nfft=length(y);
nfft2=1000;
fy=fft(y,nfft2);
f_half=2*fy(1:(nfft2/2));
xfft=Fs.*(0:(nfft2/2)-1)/nfft2;
plot(xfft,abs(f_half)/(nfft));

更新了 FFT 转换 FIR

clc
clear all
Fs=200e3;
Ts=1/Fs;
dt=0:Ts:5e-3-Ts;

f1=1e3;
f2=20e3;
f3=30e3;

y=5*sin(2*pi*f1*dt)+5*sin(2*pi*f2*dt)+10*sin(2*pi*f3*dt);
%plot(dt,y)
nfft=length(y);
nfft2=1000;
fy=fft(y,nfft2);
f_half=2*fy(1:(nfft2/2));
xfft=Fs.*(0:(nfft2/2)-1)/nfft2;
%plot(xfft,abs(f_half)/(nfft));

cut_off=25e3/(Fs/2);
order=64;
h=fir1(order,cut_off);
con=conv(y,h)
%plot(con)
fz=fft(con,nfft2);
f_half_z=2*fz(1:(nfft2/2));
plot(xfft,abs(f_half_z)/(nfft));

更新了过滤器响应图:

clc
clear all
Fs=200e3;
Ts=1/Fs;
dt=0:Ts:5e-3-Ts;

f1=1e3;
f2=20e3;
f3=30e3;

y=5*sin(2*pi*f1*dt)+5*sin(2*pi*f2*dt)+10*sin(2*pi*f3*dt);
%plot(dt,y)
nfft=length(y);
nfft2=1000;
fy=fft(y,nfft2);
f_half=2*fy(1:(nfft2/2));
xfft=Fs.*(0:(nfft2/2)-1)/nfft2;
%plot(xfft,abs(f_half)/(nfft));

cut_off=25e3/(Fs/2);
order=32;
h=fir1(order,cut_off);
fh=fft(h,nfft2);
plot(abs(fh(1:nfft/2)));
con=conv(y,h)
%plot(con)
fz=fft(con,nfft2);
f_half_z=2*fz(1:(nfft2/2));
%plot(xfft,abs(f_half_z)/(nfft));
```
1个回答

由于您的频率f2f3是 的倍数f1=1k,并且您的时间向量是 直到5 ms,这意味着您的信号适合整个5周期、谐波和所有,因此 FFT 已经成熟了。您遇到的问题是您选择 FFT 的点数 ( 1024) 与样本数 ( ) 不同1000,所以现在一个 bin 将是Fs/nfft = 2e5/1024 = 195.31 Hz如果您检查频率向量的第一个值xfft(1:10),您会看到第一个频率落在两个箱之间:

            0
   1.9531e+02
   3.9062e+02
   5.8594e+02
   7.8125e+02
   9.7656e+02 % f1 is between this
   1.1719e+03 % ...and this
   1.3672e+03
   1.5625e+03
   1.7578e+03

另外两个有同样的症状。这意味着幅度(未归一化,这就是它的原因~5k)不能是真实的。当等效 DFT 将计算蝴蝶时,索引将不会f1在同一点匹配。如果您对1000点执行 FFT,则 bin 的宽度应该是2e5/1e3 = 200 Hz宽的。这将使频率向量显示这些前 10 个值:

      0
    200
    400
    600
    800
   1000 % spot on
   1200
   1400
   1600
   1800

使用1024长度 FFT 意味着现在有不止一只具有不同值的蝴蝶,它们都加起来。这意味着您有轻微的频谱泄漏情况,即应该存在于一个箱中的频率仅在其邻居中传播。另请参阅维基百科文章。