声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 24934|回复: 65

[FFT] [原创]zoomfft

[复制链接]
发表于 2006-5-24 12:34 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
  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 编辑 ]
回复
分享到:

使用道具 举报

发表于 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 编辑 ]
 楼主| 发表于 2006-5-26 10:47 | 显示全部楼层
没定义i,j的话,它们都是虚数单位
发表于 2006-5-29 21:52 | 显示全部楼层
不好意思,还要问一下,语句 xz=(xz/L).^0.5; 中xz是复数,求它的平方根赋给xz ,这样做的意义是什么? 谢谢,谢谢!
 楼主| 发表于 2006-5-31 14:04 | 显示全部楼层

回复:(shanghai)不好意思,还要问一下,语句 xz=(xz/...

xz不是复数,而是功率谱,这里开方是求的幅值谱,如果要求其他的谱,可做相应的改动

[ 本帖最后由 MVH 于 2006-10-4 15:53 编辑 ]

评分

1

查看全部评分

发表于 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 编辑 ]
发表于 2006-6-3 15:01 | 显示全部楼层
下标问题我已经注意到了,Vc++中 Hanning窗的一半,是0到M-1,但还是不行.     请问有没有ZoomFFT算法方面的资料,仔细研究一下,谢谢!
 楼主| 发表于 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 编辑 ]
 楼主| 发表于 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 编辑 ]

评分

1

查看全部评分

发表于 2006-6-3 19:46 | 显示全部楼层
谢谢,我再看看这方面的资料!
发表于 2006-6-4 20:10 | 显示全部楼层
请问你的ZoomFFT 中平均段数L是什么意思,丁康教授资料中并没有提到这个参数呀!
 楼主| 发表于 2006-6-10 12:06 | 显示全部楼层

回复:(shanghai)请问你的ZoomFFT 中平均段数L是什么...

哦,这个是为了减少实际工程信号中随机信号的影响而取了多段信号,然后在功率谱上做平均

[ 本帖最后由 MVH 于 2006-10-4 15:55 编辑 ]
发表于 2006-7-23 09:47 | 显示全部楼层

好东西

丁康教授教授的论文我也下了,好好看看,向大家学习。
发表于 2006-8-15 21:35 | 显示全部楼层

滤波器的半阶数是什么意思啊

滤波器的半阶数是什么意思啊
发表于 2006-8-15 23:19 | 显示全部楼层

kk=(k-1)*D+M+(i-1)*N;是什么意思?

kk=(k-1)*D+M+(i-1)*N;是什么意思?
这个程序运行有问题啊?
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

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

GMT+8, 2024-4-28 03:22 , Processed in 0.136947 second(s), 18 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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