用JAVA编写MP3解码器——GUI(FFT)(转)

源:用JAVA编写MP3解码器——GUI

/*
 * FFT.java
 * 用于频谱显示的快速傅里叶变换
 * http://jmp123.sf.net/
 */
public class FFT {
    public static final int FFT_N_LOG = 9; // FFT_N_LOG <= 13
    public static final int FFT_N = 1 << FFT_N_LOG;
    private static final float MINY = (float) ((FFT_N << 2) * Math.sqrt(2)); //(*)
    private float[] real, imag, sintable, costable;
    private int[] bitReverse;

    public FFT() {
        real = new float[FFT_N];
        imag = new float[FFT_N];
        sintable = new float[FFT_N >> 1];
        costable = new float[FFT_N >> 1];
        bitReverse = new int[FFT_N];

        int i, j, k, reve;
        for (i = 0; i < FFT_N; i++) {
            k = i;
            for (j = 0, reve = 0; j != FFT_N_LOG; j++) {
                reve <<= 1;
                reve |= (k & 1);
                k >>>= 1;
            }
            bitReverse[i] = reve;
        }

        double theta, dt = 2 * 3.14159265358979323846 / FFT_N;
        for (i = 0; i < (FFT_N >> 1); i++) {
            theta = i * dt;
            costable[i] = (float) Math.cos(theta);
            sintable[i] = (float) Math.sin(theta);
        }
    }

    /**
     * 用于频谱显示的快速傅里叶变换
     * @param realIO 输入FFT_N个实数,也用它暂存fft后的FFT_N/2个输出值(复数模的平方)。
     */
    public void calculate(float[] realIO) {
        int i, j, k, ir, exchanges = 1, idx = FFT_N_LOG - 1;
        float cosv, sinv, tmpr, tmpi;
        for (i = 0; i != FFT_N; i++) {
            real[i] = realIO[bitReverse[i]];
            imag[i] = 0;
        }

        for (i = FFT_N_LOG; i != 0; i--) {
            for (j = 0; j != exchanges; j++) {
                cosv = costable[j << idx];
                sinv = sintable[j << idx];
                for (k = j; k < FFT_N; k += exchanges << 1) {
                    ir = k + exchanges;
                    tmpr = cosv * real[ir] - sinv * imag[ir];
                    tmpi = cosv * imag[ir] + sinv * real[ir];
                    real[ir] = real[k] - tmpr;
                    imag[ir] = imag[k] - tmpi;
                    real[k] += tmpr;
                    imag[k] += tmpi;
                }
            }
            exchanges <<= 1;
            idx--;
        }

        j = FFT_N >> 1;
        /*
         * 输出模的平方(的FFT_N倍):
         * for(i = 1; i <= j; i++)
         *     realIO[i-1] = real[i] * real[i] +  imag[i] * imag[i];
         *
         * 如果FFT只用于频谱显示,可以"淘汰"幅值较小的而减少浮点乘法运算. MINY的值
         * 和Spectrum.Y0,Spectrum.logY0对应.
         */
        sinv = MINY;
        cosv = -MINY;
        for (i = j; i != 0; i--) {
            tmpr = real[i];
            tmpi = imag[i];
            if (tmpr > cosv && tmpr < sinv && tmpi > cosv && tmpi < sinv)
                realIO[i - 1] = 0;
            else
                realIO[i - 1] = tmpr * tmpr + tmpi * tmpi;
        }
    }

}
时间: 2024-10-06 04:43:16

用JAVA编写MP3解码器——GUI(FFT)(转)的相关文章

java基础学习总结——GUI编程(一)

永不放弃,一切皆有可能!!! 只为成功找方法,不为失败找借口! java基础学习总结——GUI编程(一) 一.AWT介绍 所有的可以显示出来的图形元素都称为Component,Component代表了所有的可见的图形元素,Component里面有一种比较特殊的图形元素叫Container,Container(容器)在图形界面里面是一种可以容纳其它Component元素的一种容器,Container本身也是一种Component的,Container里面也可以容纳别的Container. Cont

java编写Base64密码器

Base64加密算法,应用广泛,尤其是在电子邮件传输上,有很大的用途 用JAVA编写的程序代码如下 import java.awt.BorderLayout; import java.awt.EventQueue; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.IOException; import javax.swing.JFrame; import javax.s

怎样在CentOS linux下安装MPEG-1 Layer 3 (MP3)解码器

怎样在CENTOS linux下安装MPEG-1 Layer 3 (MP3)解码器 提片上的信息显示我们没有安装解码器,这是因为版权问题软件 没有自带解码器 我的是centos 32位系统所以用下面第一个源 32位系统 第三方源 rpm -ivh http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.2-2.el6.rf.i686.rpm 64位系统 第三方源 rpm -ivh http://pkgs.repoforge.

Java编写最大公约数和最小公倍数

package javaapplication24; class NegativeIntegerException extends Exception{ String message; public NegativeIntegerException(){ message="方法的参数值不是正整数";} public String toString(){ return message;} } class MaxCommonDivisor{ public int getMaxCommonD

java编写输入一个数判断是否是回文数,所谓回文数比如121,1221,6778776

package com.hao947; import java.util.Scanner; public class demo5 { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int x = 0; x = scanner.nextInt(); System.out.println("请输入一个4-8位的数"); int dig[] = new int[10]; i

java基础学习总结——GUI编程(二)

永不放弃,一切皆有可能!!! 只为成功找方法,不为失败找借口! java基础学习总结——GUI编程(二) 一.事件监听 测试代码一: 1 package cn.javastudy.summary; 2 3 import java.awt.*; 4 import java.awt.event.*; 5 6 public class TestActionEvent { 7 public static void main(String args[]) { 8 Frame f = new Frame("

Java编写的日期计算方法

自己用Java编写的时间获取类,目前应用在数据交换监控系统中,经测试可以正常使用. 提供以下功能: Time tt = new Time(); System.out.println("获取昨天日期:" + tt.getyd()); System.out.println("获取当天日期:" + tt.getNowTime("yyyy-MM-dd")); System.out.println("获取本周一日期:" + tt.get

Java编写串口程序

用Java编写串口程序一般都会用到这个 http://fizzed.com/oss/rxtx-for-java 根据电脑的情况下载 解压以后有安装文档 For a JDK installation: Copy RXTXcomm.jar ---> <JAVA_HOME>\jre\lib\extCopy rxtxSerial.dll ---> <JAVA_HOME>\jre\binCopy rxtxParallel.dll ---> <JAVA_HOME>

Java编写的C语言词法分析器

这是java编写的C语言词法分析器,我也是参考很多代码,然后核心代码整理起来,放在QQ空间和博客上,目的是互相学习借鉴,希望可以得到高手改进.这个词法分析器实现的功能有打开文件.保存文件.打开帮助文档.文本域内容的剪切和复制和黏贴.进行词法分析 程序的项目结构如图,Word类和Unidentifiable类是两个JavaBean类,存放的参数有两个row(整型).word(String),row用于获取行数,word用于获取标识符,LexerFrame是词法分析器的界面类,Analyze封装了进