声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

声振论坛 展示 声学噪声 查看内容

[原创]zoomfft

2010-8-24 00:11| 发布者: aspen| 查看: 1440| 评论: 65

摘要: %ZoomFFT谱 %x-信号序列 %fs-采样频率 %N-做谱点数 %fe-分析中心频率 %D-细化倍数 %L-平均段数 %M-滤波器半阶数 %f-返回频率向量 %xz-返回幅值谱 function =ZoomFFT(x,fs,N,fe,D,L,M) k=1:M; ...
  1. %ZoomFFT谱
  2. %x-信号序列
  3. %fs-采样频率
  4. %N-做谱点数
  5. %fe-分析中心频率
  6. %D-细化倍数
  7. %L-平均段数
  8. %M-滤波器半阶数
  9. %f-返回频率向量
  10. %xz-返回幅值谱

  11. function [f xz]=ZoomFFT(x,fs,N,fe,D,L,M)

  12. k=1:M;                          
  13. w=0.5+0.5*cos(pi*k/M);          %Hanning窗

  14. fl=max(fe-fs/(4*D),-fs/2.2);
  15. fh=min(fe+fs/(4*D),fs/2.2);

  16. yf=D*fl;                       %移频量
  17. df=fs/D/N;
  18. f=fl:df:fl+(N/2-1)*df;
  19. xz=zeros(1,N/2);
  20. wl=2*pi*fl/fs;
  21. wh=2*pi*fh/fs;
  22. hr(1)=(wl-wh)/pi;
  23. hr(2:M+1)=(sin(wl*k)-sin(wh*k))./(pi*k).*w;
  24. hi(1)=0;
  25. hi(2:M+1)=(cos(wl*k)-cos(wh*k))./(pi*k).*w;

  26. k=0:N-1;
  27. w=0.5-0.5*cos(2*pi*k/N);

  28. for i=1:L
  29.     for k=1:N
  30.         kk=(k-1)*D+M+(i-1)*N;
  31.         xrz(k)=x(kk+1)*hr(1)+sum(hr(2:M+1).*(x(kk+2:kk+M+1)+x(kk:-1:kk-M+1)));
  32.         xiz(k)=x(kk+1)*hi(1)+sum(hi(2:M+1).*(x(kk+2:kk+M+1)-x(kk:-1:kk-M+1)));
  33.     end
  34.     xzt=(xrz+j*xiz).*exp(-j*2*pi*(0:N-1)*yf/fs);
  35.     xzt=xzt.*w;
  36.     xzt=xzt-sum(xzt)/N;
  37.     xzt=fft(xzt);
  38.     xz=xz+(abs(xzt(1:N/2))/N*2).^2;
  39. end
  40. xz=(xz/L).^0.5;
复制代码

[ 本帖最后由 MVH 于 2006-10-4 15:52 编辑 ]
发表评论

最新评论

引用 shanghai 2006-5-26 10:40
  1. for i=1:L
  2. for k=1:N
  3. kk=(k-1)*D+M+(i-1)*N;
  4. xrz(k)=x(kk+1)*hr(1)+sum(hr(2:M+1).*(x(kk+2:kk+M+1)+x(kk:-1:kk-M+1)));
  5. xiz(k)=x(kk+1)*hi(1)+sum(hi(2:M+1).*(x(kk+2:kk+M+1)-x(kk:-1:kk-M+1)));
  6. end
  7. xzt=(xrz+j*xiz).*exp(-j*2*pi*(0:N-1)*yf/fs);
  8. xzt=xzt.*w;
  9. xzt=xzt-sum(xzt)/N;
  10. xzt=fft(xzt);
  11. xz=xz+(abs(xzt(1:N/2))/N*2).^2;
  12. end
复制代码




上面ZoomFFT里面这段代码没看明白, j指的是什么?

[ 本帖最后由 MVH 于 2006-10-4 15:53 编辑 ]
引用 yangzj 2006-5-26 10:47
没定义i,j的话,它们都是虚数单位
引用 shanghai 2006-5-29 21:52
不好意思,还要问一下,语句 xz=(xz/L).^0.5; 中xz是复数,求它的平方根赋给xz ,这样做的意义是什么? 谢谢,谢谢!
引用 yangzj 2006-5-31 14:04
xz不是复数,而是功率谱,这里开方是求的幅值谱,如果要求其他的谱,可做相应的改动

[ 本帖最后由 MVH 于 2006-10-4 15:53 编辑 ]
引用 shanghai 2006-6-2 10:31
  1. #define N 2048
  2. #define pi 3.1415926
  3. #define M 10
  4. void CAnalysisDlg::ZoomFFT(double *x, double fs, double fe, int D, int L)
  5. {
  6. double wl,wh,fl,fh,yf,df,c;
  7. int kk;
  8. complex N1,L1,w2,x1,x2,sumxzt;

  9. int i,j;

  10. for(i=0;i<M;i++)
  11. {
  12. w0=0.5+0.5*cos(pi*i/M);
  13. }
  14. fl=(fe-fs/(4*D))>(-fs/2.2) ? (fe-fs/(4*D)):(-fs/2.2);
  15. fh=(fe+fs/(4*D))<(fs/2.2) ? (fe+fs/(4*D)):(fs/2.2);
  16. yf=D*fl;
  17. df=fs/D/N;

  18. for(i=0;i<=(N/2-1);i++)
  19. {
  20. f=fl+i*df;
  21. }

  22. wl=2*pi*fl/fs;
  23. wh=2*pi*fh/fs;

  24. hr[0]=(wl-wh)/pi;
  25. for(i=1;i<=M;i++)
  26. {
  27. hr=(sin(wl*i)-sin(wh*i))/(pi*i)*w0[i-1];
  28. }
  29. hi[0]=0;
  30. for(i=1;i<=M;i++)
  31. {
  32. hi=(cos(wl*i)-cos(wh*i))/(pi*i)*w0[i-1];
  33. }

  34. for(i=0;i<N;i++)
  35. {
  36. w1=0.5-0.5*cos(2*pi*i/N);
  37. }

  38. for(i=0;i<L;i++)
  39. {
  40. for(j=0;j<N;j++)
  41. {
  42. kk=j*D+M+i*N;
  43. for(int m=1;m<=M;m++)
  44. {
  45. sumhr=sumhr+hr[m]*(x[kk+1+m]+x[kk-m+1]);
  46. sumhi=sumhi+hi[m]*(x[kk+1+m]-x[kk-m+1]);
  47. }
  48. xrz[j]=x[kk+1]*hr[0]+sumhr;
  49. xiz[j]=x[kk+1]*hi[0]+sumhi;
  50. }
  51. }
  52. N1=complex(N,0);
  53. for(int k=0;k<N;k++)
  54. {
  55. x1=complex(xrz[k],xiz[k]);
  56. x2=complex(cos(2*pi*k*yf/fs),-sin(2*pi*k*yf/fs));
  57. xzt[k]=x1*x2;
  58. w2=complex(w1[k],0);
  59. xzt[k]=xzt[k]*w2;
  60. sumxzt=sumxzt+xzt[k];
  61. xzt[k]=xzt[k]-sumxzt/N1;
  62. }
  63. fft(xzt,11);
  64. for(i=0;i<N/2;i++)
  65. {
  66. xz=(xzt.Real()*xzt.Real()+xzt.Imag()*xzt.Imag())/(1024*1024);
  67. }

  68. for(i=0;i<N/2;i++)
  69. {
  70. xz=sqrt(xz/L);
  71. }
  72. }
复制代码


该程序是我把上面的Matlab版 ZoomFFT改写成Vc++版,该程序通过编译没有问题,我调用函数ZoomFFT(dc,100000.0,3125.0,8,5),但是其中的xiz,xrz始终为0,所以后面的xz当然也是0了,请问这个函数错误在哪里,请指点指点,谢谢!!!

[ 本帖最后由 MVH 于 2006-10-4 15:54 编辑 ]
引用 shanghai 2006-6-3 15:01
下标问题我已经注意到了,Vc++中 Hanning窗的一半,是0到M-1,但还是不行.     请问有没有ZoomFFT算法方面的资料,仔细研究一下,谢谢!
引用 yangzj 2006-6-3 17:31
我采用的是丁康教授提出的基于复解析带通滤波器的复调制细化选带频谱分析,你可以参考这两篇论文:
[1] 丁康,谢明等. 基于复解析带通滤波器的复调制细化频谱分析方法研究[J]. 振动工程学报. 2001, 14(1):29~35.



[2] 谢明,丁康. 基于复解析带通滤波器的复调制细化谱分析的算法研究[J]. 振动工程学报. 2002, 15(4):479~483.

[ 本帖最后由 MVH 于 2006-10-4 15:55 编辑 ]
引用 yangzj 2006-6-3 17:34
  1. for(i=0;i<M;i++)
  2. {
  3. w0=0.5+0.5*cos(pi*i/M);
  4. }
  5. 应该改成
  6. for(i=0;i<M;i++)
  7. {
  8. w0=0.5+0.5*cos(pi*(i+1)/M);
  9. }  
复制代码

[ 本帖最后由 MVH 于 2006-10-4 15:55 编辑 ]
引用 shanghai 2006-6-3 19:46
谢谢,我再看看这方面的资料!
引用 shanghai 2006-6-4 20:10
请问你的ZoomFFT 中平均段数L是什么意思,丁康教授资料中并没有提到这个参数呀!
引用 yangzj 2006-6-10 12:06
哦,这个是为了减少实际工程信号中随机信号的影响而取了多段信号,然后在功率谱上做平均

[ 本帖最后由 MVH 于 2006-10-4 15:55 编辑 ]
引用 snort 2006-7-23 09:47
丁康教授教授的论文我也下了,好好看看,向大家学习。
引用 liuhuanjun 2006-8-15 21:35
滤波器的半阶数是什么意思啊
引用 liuhuanjun 2006-8-15 23:19
kk=(k-1)*D+M+(i-1)*N;是什么意思?
这个程序运行有问题啊?
引用 miao7mijao 2006-9-22 08:07
现在正在学习这个程序呢,希望已经看明白的人能给我这个正徘徊在此的人一些提示,或说把你们的经验能多少的告诉我;先谢谢了!
引用 miao7mijao 2006-9-22 14:07
程序中的
fl=max(fe-fs/(4*D),-fs/2.2);
fh=min(fe+fs/(4*D),fs/2.2);
是怎么回事?
引用 miao7mijao 2006-9-22 16:16
关于第2个海宁窗公式w=0.5-0.5*cos(2*pi*k/N)
我知道了是单边的,但是第1个k=1:M
w=0.5+0.5*cos(pi*k/M)
而书上为k=-N/2,。。。N/2;
w=0.5+0.5*cos(2pi*k/N);是不是只要保证k的个数与N的个数相等就可以了
也许我问的问题让大家见笑了,但是实在找不到答案了!
谢谢了!
引用 miao7mijao 2006-9-22 19:08
我这提示:xrz(k)=x(kk+1)*hr(1)+sum(hr(2:M+1).*(x(kk+2:kk+M+1)+x(kk:-1:kk-M+1)));这一句超过矩阵界限
那你测试的结果对吗?
我也运行了,也出现类似的问题?该怎么解决?
引用 songzy41 2006-9-23 06:51
原帖由 miao7mijao 于 2006-9-22 16:16 发表
关于第2个海宁窗公式w=0.5-0.5*cos(2*pi*k/N)
我知道了是单边的,但是第1个k=1:M
w=0.5+0.5*cos(pi*k/M)
而书上为k=-N/2,。。。N/2;
w=0.5+0.5*cos(2pi*k/N);是不是只要保证k的个数与N的个数相等就可以了 ...

对于海宁窗的表达式:
w=0.5+0.5*cos(pi*k/N)
适用于k=-N/2,。。。N/2;而
w=0.5-0.5*cos(2*pi*k/N)
适用于k=0:N-1。这是由笫1式在时间上平移了N/2个点。因为我们实际中信号都是N长,时间上是Δt,2Δt,...NΔt(Δt是采样周期),加海宁窗时用笫2式。

查看全部评论(65)

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

GMT+8, 2024-11-28 11:00 , Processed in 0.072555 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

返回顶部