首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DFT中的星等谱

DFT中的星等谱
EN

Stack Overflow用户
提问于 2013-04-17 17:15:16
回答 1查看 474关注 0票数 1

我正在尝试用Java编写一个小的离散傅立叶变换,以便在一个清晰的400 Hz正弦信号中找到幅度谱(1秒作为pcm有符号-短)

因此,首先我计算复数值的DFT:

代码语言:javascript
复制
public void berechneDFT(int abtastwerte) {
        int i;

        int N = abtastwerte;
        ReX = new double[N/2+1];
        ImX = new double[N/2+1];

        TextFileOperator tfo = new TextFileOperator(file.substring(0, file.length()-4)+"_DFT.txt");

        try {
            tfo.openOutputStream();
            tfo.writeString("ReX      ImX\n");
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }

        // real-Anteil berechnen
        for (i=0, ReX[i] = 0, ImX[i] = 0; i <= N/2; i++)
        {
            for(int n=0; n < N; n++)
            {
                ReX[i] += x[n] * Math.cos( (2.0 * Math.PI * n * i) / (double) N);
                ImX[i] += - (x[n] * Math.sin( (2.0 * Math.PI * n * i) / (double) N));
            }

            tfo.writeString(ReX[i] +" "+ImX[i]+"\n");
        }

        x = null;   
        tfo.closeOutputStream();    // flush

        System.out.println("Anteile berechnet.");
    }

然后我试着计算星等谱:

代码语言:javascript
复制
public void berechneBetragsSpektrum() {

        int N = ReX.length;

        TextFileOperator tfo = new TextFileOperator("betragsspektrum_400hz.txt");
        try {
            tfo.openOutputStream();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        double powerAtFreq;
        int marker = 0;
        double maxPowerAtFreq = 0;

        for(int i=0; i < N; i++)
        {
            double A1 = ReX[i] * ReX[i];
            double A2 = ImX[i] * ImX[i];

            powerAtFreq = Math.sqrt(A1+A2);

            if(powerAtFreq > maxPowerAtFreq)
            {
                maxPowerAtFreq = powerAtFreq;
                marker = i;
            }

            tfo.writeString(powerAtFreq+"\n");
        }

        tfo.closeOutputStream();
        System.out.println("Stärkste Frequenz: "+(marker)+" Hz");
    }

但由于某些原因,如果我选择检查所有16000个样本,我只能得到‘标记’中400HZ的结果。但是,如果我只选择800个样本,我不也应该看到400 Hz的峰值吗?因为在800个样本中,我可以看到800/2 = 400 Hz作为最大频率?

我猜一定是代码中的一些小问题,因为如果我选择800个样本,我得到20赫兹,对于1600个样本,我得到40赫兹,它总是1/40 *采样率。

我到底错过了什么或者做错了什么?结果很奇怪..

请注意,如果我用复数值做逆DFT,我可以再次重建音频信号!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-10-17 19:27:21

这个问题的答案是,如果你计算傅立叶变换,幅度谱等,指数显示相对频率,需要计算到它们的正确值。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16056138

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档