声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 1073|回复: 2

[FFT] 振幅总出现在采用频点的右侧(大于采频)FFT

[复制链接]
发表于 2008-4-22 20:17 | 显示全部楼层 |阅读模式

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

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

x
大家好,
我在做一个声音采样分析,目前做好了一个程序包(C#),有三部分: 声音采样,FFT分析,以及坐标图。现在出现了问题,我把信号发生器频率调到1000Hz,但在正弦波下,其峰值出现在2700Hz处,我调了几个频率值,出现的峰值均是采样频率的2.7倍。这是什么问题呢?我觉得这个问题不属于修正范围内的。

FFT程序
static private int BitReverse(int j)
        {
            int j2;
            int j1 = j;
            int k = 0;
            for (int i = 1; i <= nu; i++)
            {
                j2 = j1 / 2;
                k = 2 * k + j1 - 2 * j2;
                j1 = j2;
            }
            return k;
        }

        static public double[] FFTDb(ref double[] x)
        {
            // Assume n is a power of 2
            n = x.Length;
            nu = (int)(Math.Log(n) / Math.Log(2));
            int n2 = n / 2;
            int nu1 = nu - 1;
            double[] xre = new double[n];
            double[] xim = new double[n];
            double[] decibel = new double[n2];
            double tr, ti, p, arg, c, s;
            for (int i = 0; i < n; i++)
            {
                xre = 0.0f;
                xim = x
            }
            int k = 0;
            for (int l = 1; l <= nu; l++)
            {
                while (k < n)
                {
                    for (int i = 1; i <= n2; i++)
                    {
                        p = BitReverse(k >> nu1);
                        arg = 2 * (double)Math.PI * p / n;
                        c = (double)Math.Cos(arg);
                        s = (double)Math.Sin(arg);
                        tr = xre[k + n2] * c + xim[k + n2] * s;
                        ti = xim[k + n2] * c - xre[k + n2] * s;
                        xre[k + n2] = xre[k] - tr;
                        xim[k + n2] = xim[k] - ti;
                        xre[k] += tr;
                        xim[k] += ti;
                        k++;
                    }
                    k += n2;
                }
                k = 0;
                nu1--;
                n2 = n2 / 2;
            }
            k = 0;
            int r;
            while (k < n)
            {
                r = BitReverse(k);
                if (r > k)
                {
                    tr = xre[k];
                    ti = xim[k];
                    xre[k] = xre[r];
                    xim[k] = xim[r];
                    xre[r] = tr;
                    xim[r] = ti;
                }
                k++;
            }
采频方程:

static public double[] xAx(ref double[] x)
      {
           n = x.Length;        
          double[] myX = new double[n/2];
  
          for (int i = 0; i < (n/2); i++)      
           myX =(double)i* 44100 / n;         
      
          return myX;         
         
      }

请高手指点,多谢。
回复
分享到:

使用道具 举报

发表于 2008-4-23 09:04 | 显示全部楼层
不懂C#,我感觉这句代码有问题,不知道对不对。
for (int i = 0; i < (n/2); i++)      
  myX =(double)i* 44100 / n;     
myX是个数组,好像应该这样赋值:
for (int i = 0; i < (n/2); i++)      
  myX [ i ]  =(double)i* 44100 / n;

[ 本帖最后由 erdgzw 于 2008-4-23 10:05 编辑 ]
 楼主| 发表于 2008-4-23 15:31 | 显示全部楼层
hi erdgzw,

you are right, actualy my code is :

static private int n;
      static public double[] xAx(ref double[] x)
      {
           n = x.Length;         
          double[] myX = new double[n/2];
      
          for (int i = 0; i < (n/2); i++)
      
              myX [ i ] = (double)i * 44100 / n ;         
      
          return myX;                 
      }

and i think there must be another mistake or something, should be thought about. But now i dont know.  By the way i am in oversee and cant write chinese now, sorry,but thx  your answer.

best regards
sam


[ 本帖最后由 samdhy 于 2008-4-23 15:33 编辑 ]
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

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

GMT+8, 2024-11-19 05:56 , Processed in 0.065507 second(s), 18 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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