声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

12
返回列表 发新帖
楼主: 16443

[滤波] 大家看看我的滤波程序哪里有问题

[复制链接]
发表于 2008-7-8 14:56 | 显示全部楼层
本帖最后由 VibInfo 于 2016-11-7 14:56 编辑
原帖由 zhly 于 2008-7-7 17:59 发表
a(nfft-nmax+1:nfft-nmin+1)=y(nfft-nmax+1:nfft-nmin+1); %将y负频率阻带内的元素值置为0
程序中这句怎么实现的“将y负频率阻带内的元素值置为0”?我运行程序后还是不太理解。

应把程序中以下4语句一起理解:
y=fft(x,nfft);
a=zeros(1,nfft);
a(nmin:nmax)=y(nmin:nmax);        %将y正频率阻带内的元素值置为0
a(nfft-nmax+1:nfft-nmin+1)=y(nfft-nmax+1:nfft-nmin+1); %将y负频率阻带内的元素值置为0
笫1句是把信号x做FFT,变换成y
笫2句是另设置一个谱函数a,它的正负频率部分都为0,即是一个全0数列
笫3句是把正频率部分中需要的部分赋于a,正频率部分中,需要部以外都为0
笫4句是把负频率部分中需要的部分赋于a,负频率部分中,需要部以外都为0
回复 支持 反对
分享到:

使用道具 举报

发表于 2008-7-8 20:55 | 显示全部楼层
多谢楼上的详细解释。
上面的四句中,前三句能理解,只是第四句中元素下标(nfft-nmax+1:nfft-nmin+1)对应
((32768-1000+1):(32768-0+1)),我不明白这个下标对应的频率范围为什么是需要的负频率部分?
发表于 2008-7-8 21:17 | 显示全部楼层
将plot(ff,20*log10(abs(X(1:N/2+1)*2/N))); 这句改用
semilogx(ff,(abs(X(1:N/2+1)*2/N)).^2);得到的图形相差很大,
用semilogx()画图与将待画图量取10*log10()有何区别?
还有我在自己的程序中试用loglog(f,px)与plot(10*log10(f),10*log10(f))两种方法画图,得到的图形也不一致,这是怎么回事?原以为是一样的。
发表于 2008-7-8 21:18 | 显示全部楼层

补充一下,我在17楼写错了

(nfft-nmax+1:nfft-nmin+1)对应
((32768-6555+1):(32768-1+1))
发表于 2008-7-9 09:58 | 显示全部楼层
本帖最后由 VibInfo 于 2016-11-7 14:56 编辑
原帖由 zhly 于 2008-7-8 20:55 发表
多谢楼上的详细解释。
上面的四句中,前三句能理解,只是第四句中元素下标(nfft-nmax+1:nfft-nmin+1)对应
((32768-1000+1):(32768-0+1)),我不明白这个下标对应的频率范围为什么是需要的负频率部分?
补充一下,我在17楼写错了(nfft-nmax+1:nfft-nmin+1)对应
((32768-6555+1):(32768-1+1))

我细看了一下,以下这求负频部分的语句有错
a(nfft-nmax+1:nfft-nmin+1)=y(nfft-nmax+1:nfft-nmin+1);
应改为
a(nfft-nmax+2:nfft-nmin+2)=y(nfft-nmax+2:nfft-nmin+2);
而且在上式计算中nmin不能等于1(fmin不能为0)。
发表于 2008-7-9 10:31 | 显示全部楼层
本帖最后由 VibInfo 于 2016-11-7 14:56 编辑
原帖由 songzy41 于 2008-7-9 09:58 发表

我细看了一下,以下这求负频部分的语句有错
a(nfft-nmax+1:nfft-nmin+1)=y(nfft-nmax+1:nfft-nmin+1);
应改为
a(nfft-nmax+2:nfft-nmin+2)=y(nfft-nmax+2:nfft-nmin+2);
而且在上式计算中nmin不能等于1(fmi ...

还是理解不了,如果fmin不能等于零,这跟初始设置和程序运行的nmin=1也矛盾了。

这种滤波方法是否可取?
发表于 2008-7-9 14:40 | 显示全部楼层
本帖最后由 VibInfo 于 2016-11-7 14:56 编辑
原帖由 zhly 于 2008-7-9 10:31 发表


还是理解不了,如果fmin不能等于零,这跟初始设置和程序运行的nmin=1也矛盾了。

这种滤波方法是否可取?

1,先来说明一下关系式:a(nfft-nmax+2:nfft-nmin+2)=y(nfft-nmax+2:nfft-nmin+2);
nfft=32768太大了,用nfft=16来说明。有频率域数据y(1)~y(16),在其中y(1)是直流分量,y(9)是代表fs/2的谱线。互为共轭对称的谱线之间关系是:
y(2)~y(16);   y(3)~y(15);   y(4)~y(14);   y(5)~y(13);   y(6)~y(12);   y(7)~y(11);   y(8)~y(10)
在~符号的左边的那条谱线代表的是正频率部分,而在~符号的右边的那条谱线代表的是负频率部分。这可以看到,在已知某一条谱线为n,则用y(nff-n+1)得不到该n谱线对应的的负频率谱线,而要用y(nff-n+2)才能得到。所以说a(nfft-nmax+1:nfft-nmin+1)=y(nfft-nmax+1:nfft-nmin+1);有错误。
2,对于nmin=1,相当于是y(1),即是直流分量的那条谱线(它是实数),但于y(1)的那条谱线,不存在与它对应的负频率的共轭谱线。所以若nmin=1,就不能参与计算相应负频率的运算。在正频率部分已设置了:
a(nmin:nmax)=y(nmin:nmax);  
在负频率部分应加上条件语句:
if nmin==1
a(nfft-nmax+2:nfft)=y(nfft-nmax+2:nfft);
else
a(nfft-nmax+2:nfft-nmin+2)=y(nfft-nmax+2:nfft-nmin+2);
end
发表于 2008-7-9 15:37 | 显示全部楼层
现在明白了,非常感谢songzy41!
按您的假设理解,若nfft=16,
1,如果nmin=1,nmax=7,
则a(11:16)=y(11:16);%这里把需要的负频率部分赋给了a。y(11:16)是y(2:7)对应的负频率部分,y(2)~y(16);     y(7)~y(11);
2,如果nmin=3,nmax=6,
则a(12:15)=y(12:15);%y(12:15)是y(3:6)对应的负频率部分,y(3)~y(15);     y(6)~y(12);
发表于 2012-6-6 12:12 | 显示全部楼层
我是一个新手,最近也在自学滤波的相关内容,有没有哪位大神能够给我说下这个滤波程序的原理哈!!!感激不尽!!!!!!
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-5-19 04:13 , Processed in 0.064345 second(s), 18 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表