Java FFT音频频谱

时间:2016-05-24 13:44:18

标签: java audio fft

虽然我之前在搜索中遇到过几个问题,但他们并没有真正回答我的问题。鉴于我正在使用javax.sound.sampled库,我该如何为此编写音频频谱 This answer基本上描述了我到目前为止所做的事情 首先,我想"获取时域数据"。关于我,我有一个愚蠢的(?)问题,时域数据是什么。根据{{​​3}},它是一个图表,"显示信号如何随时间变化"。因此,它将是表示数据的函数的导数?页面右侧的示例动画看起来并不像那样,所以我抓住了这个想法。

然后在最后一点,提到的答案是根据频率"绘制"对数幅度(适当缩放);在哪里我想问一下,究竟要从哪里获得频率。

最终我得到的代码:

    int n = (int)Math.pow(2, 9);
    Complex[] timedomain = new Complex[n];
    for (int i = 0; i < n; i++) {
        timedomain[i] = new Complex(Hann(/*get time domain data i*/), 0);
    }
    Complex[] fft = FFT.fft(timedomain);
    fft = FFT.convolve(fft, fft);

    double[] logMag = new double[fft.length];

    for (int i = 0; i < fft.length; i++) {
        double re = fft[i].re();
        double im = fft[i].im();
        logMag[i] = Math.log10(re*re + im*im);
    }


    int l = logMag.length;
    int y = (int)(getHeight()*2.0f/3);


    Polygon poly = new Polygon();
    poly.addPoint(0, y);
    //Note that I am currently plotting the logMag data only!
    float barW = ((float)getWidth())/l;
    for (int x = 0; x < l; x++) {
        g.setColor(new Color(35, 111, 233));
        int h = (int)(logMag[x]);
        poly.addPoint((int)(x*(barW)), y-h);
        poly.addPoint((int)((x+1)*(barW)), y-h);
    }
    poly.addPoint(getWidth(), y);
    g.fillPolygon(poly);

任何帮助表示感谢,提前谢谢你!

0 个答案:

没有答案