麻烦问一下宋老师
我把程序中的采样频率加大一倍成400,怎么未细化的频率变大呢?本人基础太差,看了半天也没找到原因。我用幅值调制仿真信号x=3*(1+cos(2*pi*1*t)).*sin(2*pi*15*t+pi/6)+1*rand(1,N)做出的效果也不错,就是不能动采样频率200,把采样频率改成400后,这次细化的频率变小了,未细化的没动!实在想不通了。请问哪里改动一下就能通用呢。先谢了:lol 本帖最后由 wdhd 于 2016-6-3 11:17 编辑
原帖由 zhuzhusissi 于 2008-1-5 10:38 发表
我把程序中的采样频率加大一倍成400,怎么未细化的频率变大呢?本人基础太差,看了半天也没找到原因。
我用幅值调制仿真信号x=3*(1+cos(2*pi*1*t)).*sin(2*pi*15*t+pi/6)+1*rand(1,N)做出的效果也不错,就是不 ...
我对test_exzfftm并没有作太大的改动,仅设置了zhuzhusissi 的信号,得到的结果与zhuzhusissi 完全不同(见图)。附上了程序,请比较一下。
谢谢送老师
发现错误了 最大细化截至频率我自己设为25了 而没有用公式fa=fi+0.5*sf/np 这个为什么不能自己设置呢?您的源程序中 % 把信号按nfft长作FFT计算
y1=fft(x, nfft) * 2/nfft;
如果改成 y1=fft(x, nt) * 2/nt;得到的效果和细化是一样的(如附件)这就是和大版主yangzj说的一样了 FFT和ZFFT只是运算速度上有差别吧(忘了哪张帖子了) 那ZFFT在实际的振动信号处理中具体有什么应用呢?我们的传感器一组2048个信号 那我把n组信号并到一起做FFT效果的效果也很好吧?!这就试试...
再次感谢:@) 本帖最后由 wdhd 于 2016-6-3 11:15 编辑
原帖由 zhuzhusissi 于 2008-1-6 09:53 发表
发现错误了 最大细化截至频率我自己设为25了 而没有用公式fa=fi+0.5*sf/np 这个为什么不能自己设置呢?
要知道最大细化截至频率fa是怎么来的,信号原采样频率是sf,经下采样后,采样频率下降到sf/np,能分析出的最高频率是采样频率的1/2,即0.5*sf/np 。在ZFFT中把fi移到0频率,那能分析出的最高频率便是fi+0.5*sf/np ,即是fa的表达式。因此要修改fa就可按采样定理来修改。
原帖由 zhuzhusissi 于 2008-1-6 09:53 发表
如果改成 y1=fft(x, nt) * 2/nt;得到的效果和细化是一样的(如附件)这就是和大版主yangzj说的一样了 FFT和ZFFT只是运算速度上有差别吧(忘了哪张帖子了)
那ZFFT在实际的振动信号处理中具体有什么应用呢?
楼主的说法是对的,楼主指的帖子是:http://www.chinavib.com/forum/thread-55503-1-5.html。但要历史地看问题。ZFFT是在70年代提出的,当时RAM是按K为单位,一台计算机有16K或32K内存已是很好了。CPU的运算速度又十分慢。在这种情况下使用ZFFT,对于提高分辨率是十分有意义的。从现在来看,当然没有太大的必要了,只是一种方法而已。
再次感谢
宋老师回复的快 而且讲解清楚 这下算是进一步理解了细化 继续学习... 程序里有两段不明白。1、y1=fft(x, nfft) * 2/nfft;
为什么要乘以2再除以nfft?
2、排列数据时:
y2=zeros(1, nfft/2);
y2(1: nfft/4) =a(nfft-nfft/4+1 : nfft);
y2(nfft/4+1 : nfft/2) =a(1: nfft/4);
n=0: (nfft/2-1);
y2是一个全零序列。为什么老师在上面解释的是:对应的是y2的那一部分?还有做重采样后点数小于nfft,补零做了nfft点的FFT。然后为什么要重排呢?是不是因为要和原来的直接做的结果对比?
还有一个问题,好像decimate函数有两个参数的时候,只做了重采样,没有滤波吧?
[ 本帖最后由 ruben052013 于 2009-3-6 12:06 编辑 ] 本帖最后由 wdhd 于 2016-6-3 11:15 编辑
原帖由 ruben052013 于 2009-3-6 10:55 发表
程序里有两段不明白。
1、y1=fft(x, nfft) * 2/nfft;
为什么要乘以2再除以nfft?
2、排列数据时:
y2=zeros(1, nfft/2);
y2(1: nfft/4) =a(nfft-nfft/4+1 : nfft);
y2(nfft/4+1 : nfft/2) =a(1: nfft/4);
n=0: (nfft/2-1);
y2是一个全零序列。为什么老师在上面解释的是:对应的是y2的那一部分?还有做重采样后点数小于nfft,补零做了nfft点的FFT。然后为什么要重排呢?是不是因为要和原来的直接做的结果对比?
还有一个问题,好像decimate函数有两个参数的时候,只做了重采样,没有滤波吧?
1,是为了求出窄带信号的幅值;
2,是为了和原来的直接结果做对比;
3,decimate函数有两个参数的时候,重采样前先滤波:
DECIMATE Resample data at a lower rate after lowpass filtering.
Y = DECIMATE(X,R) resamples the sequence in vector X at 1/R times the
original sample rate.The resulting resampled vector Y is R times
shorter, i.e., LENGTH(Y) = CEIL(LENGTH(X)/R). By default, DECIMATE
filters the data with an 8th order Chebyshev Type I lowpass filter with
cutoff frequency .8*(Fs/2)/R, before resampling.
回复 22楼 songzy41 的帖子
fft的结果是复数,求幅值应该是求模才对啊?不好意思,decimate函数是我看错了!
还有一个问题请教老师,看了大家以前的讨论。让我觉得复调制zoomfft的有效性很值得商榷,无论怎样,在滤波的过程中,运算量都不会比直接对这个序列做FFT的运算量小。
滤波,在时域是卷积,但是大家都知道,快速卷积肯定比时域卷积效率高,运算量小。而快速卷积第一步就是对序列做FFT。而且点数要比原序列点数大。这样做完FFT,分辨率就已经能达到zoomfft后的结果了!那滤波结束就已经完成提高分辨率的任务了!这点很疑惑。 本帖最后由 wdhd 于 2016-6-3 11:15 编辑
原帖由 ruben052013 于 2009-3-8 11:43 发表
还有一个问题请教老师,看了大家以前的讨论。让我觉得复调制zoomfft的有效性很值得商榷,无论怎样,在滤波的过程中,运算量都不会比直接对这个序列做FFT的运算量小。
滤波,在时域是卷积,但是大家都知道,快速卷积肯定比时域卷积效率高,运算量小。而快速卷积第一步就是对序列做FFT。而且点数要比原序列点数大。这样做完FFT,分辨率就已经能达到zoomfft后的结果了!那滤波结束就已经完成提高分辨率的任务了!这点很疑惑。
现在来说,ZFFT实际上只是一个方法而已,正如LZ说到的原因目前很少使用到了。但ZFFT是在上世纪70年代中发展起来的,当时还没有RAM(Random Access Memory),存储器是磁芯穿起来的,CPU的运算速度相当慢(和现在相比),所以该方法在当时可减小存储空间,减少运算量( 滤波用IIR滤波器)。 程序运行时出现提示:
??? Input argument 'x' is undefined.
Error in ==> C:\MATLAB6p5p1\work\exzfft_m.m
On line 8==> nt=length(x);
我就是想输入的信号是个正弦先好比如x=cos(2*pi*f1*t+50)+cos(2*pi*f2*t)+cos(2*pi*f3*t+125);
应该怎么把这个信号加入到程序中?谢谢
回复 楼主 songzy41 的帖子
请问楼主,为什么画出来的图前几点没有了呢?怎么补上呢?谢谢!~ 回复 1 # songzy41 的帖子na在程序中好像没用到吧?~ 顶一顶,正在学习中 这个程序和王济老师书上的几乎没啥区别。只是函数里将原来的带通滤波变成了下采样。而且对于采样频率高(比如我们用的16000hz的采样信号)的信号,几乎起不到细化的作用。相反他会使频率幅值显著下降,从而失真。我想频率细化只能用于较低的采样频率信号。请大家指教。 这个程序和王济老师书上的几乎没啥区别。只是函数里将原来的带通滤波变成了下采样。而且对于采样频率高(比如我们用的16000hz的采样信号)的信号,几乎起不到细化的作用。相反他会使频率幅值显著下降,从而失真。我想频率细化只能用于较低的采样频率信号。请大家指教。