「java采样」java采样算法

博主:adminadmin 2022-12-28 20:42:11 72

今天给各位分享java采样的知识,其中也会对java采样算法进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

如何用java编程,实现声音特征的提取?

您好,1 双方之间的网络连接

Java在这方面有其独特的优势,Java提供了丰富的网络类库的支持,可以轻松编写多种类型的网络通信程序。在我下面的例子中我就使用了TCP/IP协议,通过Java的Socket类进行编程。

2 音频信号的采集和回放以及音频数字信号的编码与解码

在解决这两个问题的时候,在网上很幸运地通过一些文章的介绍,找到了Answer Machine 演示程序的源代码(由of jsresources.org的Florian Bomers 和Matthias Pfisterer编写,网址)。在这个程序代码中,有几个解决我们问题所需要的类,而且作者将这些类封装的很好,我们基本不需要做什么改动,只需要屏蔽其中的调试信息的输出就行了,更可贵的是它还封装了几种常见的音频格式。其中的GSM格式(Global System for Mobile Telecommunications)就是我们下面例子中采用的压缩格式,GSM格式可以将128kbps 的音频数据流 (16bit通过8k Hz的音频采样) 压缩为13kbps 的音频数据流,非常适合语音信号的传送,所以可谓是一石二鸟。

我分析过这几个类的源代码,不得不佩服它的作者,每个类的源代码都很精炼,大家可以自己分析一下。好了下面就给大家讲讲这几个类,并且将它们用到的Java Sound API中的类和函数等一并做个简单介绍,让大家对Java Sound API中常用的类也有个大致的了解。由于Java Sound API中的类比较多。限于篇幅无法对所有用到的类做详尽的解释,以下内容只是简单提及了各个类的用途和使用规范,有关Java Sound API中类的具体介绍请大家访问这里, 查找javax.sound.sampled的相关内容。

以下的提到几个文件是从Answer Machine 演示程序的源代码中提取出来的,由于是开放源代码的程序,大家在使用的时候请注意相关的公共协议。

① AMAudioFormat类(封装在AMAudioFormat.java文件中)

AMAudioFormat类封装了CD、FM、TELEPHONE、GSM这四种质量的音频格式的参数,使用起来也非常简单,这样我们在使用Java Sound API时就不用自己去写那些复杂的代码了,但为了明白Java Sound API的原理,我们需要对它的代码做一下分析。它使用了Java Sound API中的AudioFormat这个类,这个类非常重要,在Java中对任何音频数据的使用都要实现通过它指定所需要使用的音频格式,AudioFormat类有一个嵌套的类AudioFormat.Encoding,实际上大部分对AudioFormat类的使用都是使用的这个嵌套的类。

AMAudioFormat类的重要方法:

名称:getLineAudioFormat

调用格式:getLineAudioFormat(整型音频格式代号)

返回值: 根据传递音频格式代号生成的AudioFormat对象。

说道这里大家可能要问了,那么通过Java Sound API可以直接使用GSM格式吗?答案是比较复杂,但同样有解决的办法,作者在这里使用了另外的开源程序的类库-tritonus的GSM编码解码库。大家需要在这里下载tritonous_share.jar和tritonus_gsm.jar两个文件,并在AMAudioFormat类中引用,这样就完成了GSM格式的设置。需要告诉大家的是在对AMAudioFormat.java这个类进行编译后,我们的程序运行的时候就可以不需要tritonous_share.jar和tritonus_gsm.jar这两个文件的支持了。

② AudioCapture类(封装在AudioCapture.java文件中)

AudioCapture类封装了从音频硬件捕获音频数据并自动编码为GSM音频压缩数据的过程,并且通过它的getAudioInputStream()方法提供给我们一个音频数据输入流,我们就可以直接将这个流发送到网络中。

AudioCapture 类的重要方法:

名称:getAudioInputStream

调用格式:getAudioInputStream()

返回值:AudioInputStream对象

AudioCapture 类使用了Java Sound API中的AudioInputStream、AudioFormat、AudioSystem这几个类和TargetDataLine、LineListener接口。除了AudioFormat类我再简单介绍一下其他的类:

AudioInputStream 类是带有特殊音频格式和长度的InputStream类,它有两个构造方法,分别是AudioInputStream(InputStream stream, AudioFormat format,long length)和AudioInputStream(TargetData -Line line)。

TargetDataLine 接口是DataLine接口的一种,通过它就可以直接从音频硬件获取数据了,它有几个常用的方法,分别是:open(AudioFormat format)、void open(AudioFormat format, int bufferSize)、int read(byte[] b, int off, int len)。

AudioSystem 类是Java标准音频系统的入口点,在AudioSystem 类中使用他的getLine() 方法创建TargetDataLine对象。

LineListener接口用来对线路状态改变的时间进行监听,他的重要的方法是update(LineEvent event)方法。

③ AudioPlayStream类(封装在AudioPlayStream.java文件中)

AudioPlayStream类与AudioCapture类刚好相反,它封装了GSM压缩音频数据的解码和音频信号的回放过程,提供给我们一个音频信号输出流。AudioCapture类用到的Java Sound API中的类它也基本都用到了,只是它使用了SourceDataLine接口而不是TargetDataLine接口

④ Debug类(封装在Debug.java文件中)

Debug类主要用来在调试时输出讯息,代码很少,后来我把其中输出信息的语句都屏蔽了,对程序运行没有影响。

为了方便使用以上的几个类,我们需要对它们进行编译和打包,编译时需要设置相关的编译环境,以下是我们需要用到的命令行

set CLASSPATH=%CLASSPATH%;.;tritonus_gsm.jar;tritonus_share.jar

javac am*.java amaudio*.java

jar cmf packagingmanifest.mf am.jar am*.class

amaudio*.class

说明一下,我将以上提到的Java源码文件放在了am目录下,编译之后可以得到一个8k的am.jar文件,我们下一步所需要做的就是在我们的程序中引用这个包。

Java代码怎么实现图像采样距离变换算法

算法是别人提出来的,感兴趣可以搜索《Distance Transforms of Sampled Functions》这篇论文,网上也有很多实现的代码,但是结构不是很好,而且很分散不是一个完整的算法。所以我整理了一下,写成一个单独的类,只要简单调用一下即可出结果图片。至于算法原理什么的,我真很难解释清楚,大致的思想是基于能量最小化的,分别进行行与列的1D距离变变换采样。

package com.gloomyfish.image.transform;    

    

import java.awt.image.BufferedImage;    

    

import com.gloomyfish.filter.study.GrayFilter;    

/**   

 *    

 * @author gloomyfish   

 *   

 */    

public class FastDistanceTransformAlg extends GrayFilter {    

    public final static double INF = 1E20;    

    private int backgroundColor = 0; // default black    

    

    public int getBackgroundColor() {    

        return backgroundColor;    

    }    

    

    public void setBackgroundColor(int backgroundColor) {    

        this.backgroundColor = backgroundColor;    

    }    

    

    @Override    

    public BufferedImage filter(BufferedImage src, BufferedImage dest) {    

        int width = src.getWidth();    

        int height = src.getHeight();    

        dest = super.filter(src, null);    

            

        //    

        int[] inPixels = new int[width*height];    

        float[] outPixels = new float[width*height];    

        getRGB( dest, 0, 0, width, height, inPixels );    

        int index = 0;    

        for(int row=0; rowheight; row++) {    

            int tr = 0;    

            for(int col=0; colwidth; col++) {    

                index = row * width + col;    

                tr = (inPixels[index]  16)  0xff;    

                if(tr == backgroundColor)    

                    outPixels[index] = (float)INF;    

                else    

                    outPixels[index] = 0;                       

            }    

        }    

            

        // transform along columns    

        float[] f = new float[Math.max(width, height)];    

        for(int col=0; colwidth; col++) {    

            for(int row=0; rowheight; row++) {    

                index = row * width + col;    

                f[row] = outPixels[index];    

            }    

            float[] disColumns = distance1DTransform(f, height);                

            for(int row=0; rowheight; row++) {    

                index = row * width + col;    

                outPixels[index] = disColumns[row];    

            }    

        }    

            

        // transform along rows    

        for (int row = 0; row  height; row++) {    

          for (int col = 0; col  width; col++) {    

            index = row * width + col;    

            f[col] = outPixels[index];    

          }    

          float[] disColumns = distance1DTransform(f, width);          

          for (int col = 0; col  width; col++) {    

            index = row * width + col;    

            outPixels[index] = disColumns[col];    

          }    

        }    

            

        // post sqrt calculation    

        int[] result = new int[width*height];    

        for(int row=0; rowheight; row++) {    

            for(int col=0; colwidth; col++) {    

                index = row * width + col;    

                int pc = clamp(Math.sqrt(outPixels[index]));    

                result[index] = (255  24) | (pc  16) | (pc  8) | pc;    

            }    

        }    

        setRGB( dest, 0, 0, width, height, result );    

        return dest;    

    }    

        

    public static int clamp(double c)    

    {    

        return c  255 ? 255 : (c  0 ? 0 : (int)c);    

    }    

        

    /**   

     * 1D distance transform using squared distance   

     *    

     * @param data   

     * @param n   

     * @return   

     */    

    private float[] distance1DTransform(float[] f, int n)    

    {    

          float[] d = new float[n];    

          int[] v = new int[n];    

          double[] z = new double[n+1];    

          int k = 0;    

          v[0] = 0;    

          z[0] = -INF;    

          z[1] = +INF;    

          for (int q = 1; q = n-1; q++) {    

            double s  = ((f[q]+square(q))-(f[v[k]]+square(v[k])))/(2*q-2*v[k]);    

            while (s = z[k]) {    

              k--;    

              s  = ((f[q]+square(q))-(f[v[k]]+square(v[k])))/(2*q-2*v[k]);    

            }    

            k++;    

            v[k] = q;    

            z[k] = s;    

            z[k+1] = +INF;    

          }    

    

          k = 0;    

          for (int q = 0; q = n-1; q++) {    

            while (z[k+1]  q)    

              k++;    

            d[q] = (float)square(q-v[k]) + f[v[k]];    

          }    

          return d;    

    }    

        

    private double square(double v)    

    {    

        return v*v;    

    }    

        

}

谁有java音频降噪算法代码

应该要意识到,降噪不是一个单凭某个软件就能做到的事,否则还要那些高端硬件做什么。 撇开硬件因素,目前软件降噪常用的方法一个就是采样降噪,采集一段声音作为噪声样本

java可以实现语音识别吗

这个是可以实现的。

注:test.pcm是语音文件,可以用audacity软件打开,选择 文件-导入-裸数据。 设置采样率为8000Hz。点击播放就能听见声音了。

这个时候程序跑起来还有问题,需要将apiKey 以及secretKey填写上。这两个值是你申请应用对应的分配好的。

cuid填本机mac地址就可以了,这个值我试过好像无所谓没啥要求。

程序能跑起来,并且按照正常返回识别的语音结果。但是返回结果的编码为GBK,所以汉字显示为乱码,需要对其进行一次转码。转码的代码是我自己加上去的

编写程序,根据JAVA的随机采样方法,利用蒙特卡洛仿真方法求圆周率的近似值,

public class MonteCarloMethod {

private static void computePi() {

int count = 0;

int total = 50000;

for (int i = 1; i = total; i++) {

double x = Math.random();

double y = Math.random();

if (Math.pow(x, 2) + Math.pow(y, 2) = 1) {

count = count + 1;

}

}

double mc_pi = 4 * ((count + 0d) / total);

System.out.println(" jdk π = " + Math.PI);

System.out.println("MonteCarlo π = " + mc_pi);

System.out.println(" error = " + Math.abs(mc_pi - Math.PI) / Math.PI);

}

public static void main(String[] args) {

computePi();

}

}

求解,JAVA语言多人语音聊天怎么解决混音问

两路音视频流,符合以下条件才能混合:

格式相同,要解压成 PCM 格式。

采样率相同,要转换成相同的采样率。主流采样率包括:16k Hz、32k Hz、44.1k Hz 和 48k Hz。

帧长相同,帧长由编码格式决定,PCM 没有帧长的概念,开发者自行决定帧长。为了和主流音频编码格式的帧长保持一致,推荐采用 20ms 为帧长。

位深(Bit-Depth)或采样格式 (Sample Format) 相同,承载每个采样点数据的 bit 数目要相同。

声道数相同,必须同样是单声道或者双声道 (立体声)。这样,把格式、采样率、帧长、位深和声道数对齐了以后,两个音频流就可以混合了。

JAVA代码问题可以到即构开发者中心看看

java采样的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于java采样算法、java采样的信息别忘了在本站进行查找喔。

The End

发布于:2022-12-28,除非注明,否则均为首码项目网原创文章,转载请注明出处。