对称点搞错了, 第7点的对称点是 123点,你的对称点在122点上了,所以多了一个频率出来了.
把你的程序自己改一下,记住,matlab的下标是从1开始的
------------------------------------------
程序改了下,但是去噪后的信号,怎么有点相位失真啊??帮忙看下
fs=2;%设定采样频率
N=128;
n=0:N-1;
t=(0:1/fsN-1)/fs)';
f0=0.05;%设定正弦信号频率
f=(0:N/2-1)*fs/N;
x=sin(2*pi*f0*t);%生成正弦信号
noisex=x+randn(size(t));
noisey=fft(noisex,N);
figure(1);
subplot(311);stem(t,x);xlabel('t');ylabel('y');title('正弦信号y=2*pi*10t时域波形');grid;
y=fft(x,N);
y=2*abs(y)/N;
subplot(312);plot(f,y(1:N/2));grid;
fmin=0.0468; %最小截止频率,为0时是低通,不为0时是带通
fmax=0.0469; %最高截止频率
nfft=2^nextpow2(N); %取大于并接近n的2的幂次方为FFT长度
nmin=round(fmin*nfft/fs+1); %四舍五入取整求最小截止频率对应数组元素的下标
nmax=round(fmax*nfft/fs+1); %四舍五入取整求最大截止频率对应数组元素的下标
% %滤波******************************************************
y=fft(noisex,nfft); %fft结果存入y中
a=zeros(1,nfft); %建立一个长度为nfft元素全为0的向量
a(nmin:nmax)=y(nmin:nmax); %将y正频率阻带内的元素值置为0
a(nfft-nmax+2:nfft-nmin+2)=y(nfft-nmax+2:nfft-nmin+2); %将y负频率阻带内的元素值置为0
y1=ifft(a,nfft); %逆fft
y1=(real(y1(1:N)))'; %滤波后的信号,取变换实部n个结果为滤波列向量
% ifaf=frft(y1,-0.913); %原始信号去噪后的信号
subplot(313);plot(t,y1);grid on;
% subplot(312);plot(u,abs(ifaf));grid on;
你的频率分辨率是 fs/N = 2/128 = 0.0078125Hz
而你的 f0=0.05,
理论上应该在谱线的6.4位置上..由于频率分辨率的问题,你的最大值出现在谱线7上,
而你滤波的时候把谱线6 置零了.也就是6.4谱线的位置也置零了...
所以出现了频率相位的失真.你仔细看看,应该你的结果频率也有失真的.
解决的办法有两个,我没具体实验过,
1.就是做频谱矫正,论坛有专门的主题讲这个问题,
2.就是在滤波的时候不要直接清零,做一个插值,怎么插呢?这个我正在做一些理论的论证,和准备做一些实验.
对了...最好把你频率矫正以后的结果放上来我看看....我只是知道问题出在哪儿.但我也没做过具体的实验..
用户377235 2013-5-18 19:21