马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?我要加入
x
向各位大侠请教一下:
假设我得到一长度为L的采样序列,采样频率为fs,对这个信号进行FFT处理时发现,由于采样率较高,而所采样的点数较少,这就造成了信号的频率分辨率较低。在不改变采样频率的前提下,我想进一步提高频率分辨率,貌似只能增加采样点数,即增加序列的长度。通过研究MATLAB中的FFT定义可知,假设进行FFT变换的点数为N,如果N<L,则直接对序列进行截断取N个点;如果N>L,则对序列进行补零使信号长度为N。对信号进行补零,并不能增加新的信息。因此,如果用对信号做大于L的点数的FFT变换,并不能提高信号的频率分辨率。
我就想从增加信号的长度入手,最常用的办法就是对信号进行周期延拓,(不考虑所采的序列长度正好是整周期长度这种情况),但周期延拓存在着几个问题:一是会在时域上造成信号的不连续;二是在频域上会产生频谱泄漏,尤其是延拓的长度越长,频谱泄漏就越严重。
我看到全相位数据处理可以有效地减小频谱泄漏,因此,我就想利用全相位的方法来减小周期延拓所造成的频谱泄露。我的方案是这样的:假设信号长度为2N,取2N-1的长度进行全相位预处理,得到长度为N的新的序列,然后对新序列再进行周期延拓,然后再进行DN点的FFT变换(D为要对信号延拓的倍数,DN即为信号延拓后的长度)。
以上就是我所遇到的问题,以及我采取的办法,不知道我把问题描述清楚了没有。我的目的就是想通过周期延拓来增加信号长度,最终实现提高频率分辨率的目的,为了减小周期延拓带来的频谱泄漏,先进行全相位预处理来减小频谱泄漏效应。
以下我们假设对信号直接进行N点FFT变换为方法1,经过周期延拓后再进行DN点的FFT变换为方法2,先对信号进行全相位数据预处理再周期延拓,最后进行DN点的FFT变换为方法3,主要对这三种方法进行对比。
1.当两个信号频率为222Hz和224Hz,即都为整周期采样且频率间隔为两个频率分辨率时,方法1可以辨别出两个信号,方法2效果很好,但是方法3却旁瓣幅值很大,如图1所示。
2.当两频率分别为222Hz和223Hz时,此时方法1不能分辨两频率,而方法2和方法3仍可以分辨,这也说明增加数据长度是有效的,但方法3仍然有旁瓣,如图2所示。
3.当两频率分别为222.2Hz和223.8Hz时,方法3抑制频谱泄露可以很明显的看到,但是却增加了主谱线附近的谱线的幅值,方法3中223Hz的谱线幅值大于方法2中的幅值。如图3所示。
我现在对仿真结果有以下几个问题:
1:为什么在整周期采样时,方法3有频谱泄露,即主谱线附近的谱线有幅值?
2:为什么在方法3会使主谱线附近的谱线幅值增大,有没有办法使其变小,因为在仿真中我设的两信号幅值相等,若其中一个幅值较小,必然会被其附近谱线所淹没,而无法分辨两频率。
3:方法2和方法3中进行的都是DN点的FFT,信号长度也通过周期延拓增加到了DN点,频率分辨率应该为fs/DN,在本次仿真中应该为0.1Hz,但在第三次仿真中中信号频率为222.2Hz和223.8Hz,应该为整周期采样,但谱线仍然在222Hz处和224Hz处,而没有精确到0.1Hz,这是什么原因造成的?
4.不知我的这个方法,即先进行全相位预处理再进行周期延拓的方法是否可行?如果不可行的话,是否还有其他方法来实现我的目的。
以下是源程序:
clc;
clear;
fs=1024;
%设定采样频率
N=1024;%设定进行FFT变换的点数
D=10;%设定对频谱进一步周期延拓的倍数
M=D*N;
t=(0:2*N-1)/fs;
s_f1=222.2;
s_f2=223.8;%设定多频信号的频率
%s_fa=s_f2-5;s_fb=s_f2+5;%设定需要细化频谱区间的上下截止频率
s_A1=10;s_A2=10;%设定多频信号的幅值
s_P1=10;s_P2=120;%设定多频信号的相位
s=s_A1*cos(2*pi*t*s_f1+s_P1*pi/180)+s_A2*cos(2*pi*t*s_f2+s_P2*pi/180);%设定余弦形式的测试信号
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%首先对原始信号进行FFT变换
s1=s(1:N);
s1_fft=fft(s1,N);
a1=abs(s1_fft)*2/N;
m1=length(s1_fft);
f1=(0:m1/2-1)'*fs/N;
figure(1);subplot(311);
plot(f1,a1(1:m1/2));grid;
axis([220 230 0 10]);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%对信号进行10倍的周期延拓再进行FFT变换
for i=1:M
if mod(i,N)==0%当延拓后信号的序号是原来信号的整数倍时,把信号的最后一个值赋给延拓后的信号。
s2(i)=s1(N);
else
s2(i)=s1(mod(i,N));%不是整数倍时,新的序号取模即可
end
end
s2_fft=fft(s2,M);
a2=abs(s2_fft)*2/M;
m2=length(s2_fft);
f2=(0:m2/2-1)'*fs/M;
subplot(312);
plot(f2,a2(1:m2/2));grid;
axis([220 230 0 10]);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%进行补零延拓:
for i=1:M
if(i>N)
y2(i)=0;
else
y2(i)=s(i);
end
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%先对信号进行apFFT预处理后再进行周期延拓,再进行FFT变换
win=hanning(N)';
winn=conv(win,win);
win2=winn/sum(winn);
s3=s(1:2*N-1);
x1=s3.*win2;
x11=x1(N:end)+[0 x1(1:N-1)];
M=D*N;
for i=1:M
if mod(i,N)==0%当延拓后信号的序号是原来信号的整数倍时,把信号的最后一个值赋给延拓后的信号。
x111(i)=x11(N);
else
x111(i)=x11(mod(i,N));%不是整数倍时,新的序号取模即可
end
end
s3_fft=fft(x111,M);
a3=abs(s3_fft)*2/D;
m3=length(s3_fft);
f3=(0:m3/2-1)'*fs/M;
subplot(313);
plot(f3,a3(1:m3/2));grid;
axis([220 230 0 10]); |