文档章节

波形文件数据的表示

放个屁
 放个屁
发布于 2017/01/23 21:00
字数 926
阅读 246
收藏 0
点赞 0
评论 0

从wav文件读取数据并用波的形式表示。

 

对于模拟信号不能直接数字化,根据采样定律通过模拟-数字转换才行。

采样定律

对于频率为fi的输入模拟信号,模数转换时的采样率为fs,要保证模数转换后的数字信号能够完全恢复到输入前的模拟信号,则必须满足:

fs≥2fimax

式中  fs为采样频率;fimax为模拟信号的最高频分量的频率。上式称为采样定律(或称奈魁斯特定律)。

 

采样后,接下来是量化。量化指将信号的连续取值(或者大量可能的离散取值)近似为有限多个(或较少的)离散值的过程。量化主要应用于从连续信号到数字信号的转换中。连续信号经过采样成为离散信号,离散信号经过量化即成为数字信号。注意离散信号并不需要经过量化的过程。例如CD音频信号就是按照44110Hz的频率采样,按16位元量化为有着65536(= 2^16)个可能取值的数字信号。

量化就是将模拟声音的波形转换为数字,表示采样值的二进制位数决定了量化的精度。量化的过程是先将整个幅度划分成有限个小幅度(量化阶距)的集合,把落入某个阶距内的样值归为一类,并赋予相同的量化值。

 

编码

 对量化结果进行大端字节序、小端字节序、混合序编码。

 

代码

以无损的wav(PCM) 为例。

 

package javay.test;



import java.io.File;

import java.io.IOException;

import java.nio.ByteBuffer;

import java.nio.ByteOrder;



import javax.sound.sampled.AudioFormat;

import javax.sound.sampled.AudioInputStream;

import javax.sound.sampled.AudioSystem;

import javax.sound.sampled.UnsupportedAudioFileException;



import javafx.application.Application;

import javafx.scene.Node;

import javafx.scene.Scene;

import javafx.scene.chart.LineChart;

import javafx.scene.chart.NumberAxis;

import javafx.scene.chart.XYChart;

import javafx.scene.chart.XYChart.Series;

import javafx.scene.layout.HBox;

import javafx.stage.Stage;



/**

 * 波形文件数据的表示

 * 只表示声道1的信息

 */

public class TestWaveDraw extends Application {

    // 常量

    private final String fileName = "music/dog01.wav"; // 要表示的声音文件

    private final double sec = 0.15; // 要表示的时长(s)



    // 获取声音信息用的变量

    private AudioFormat format = null;

    private int[] values = null;



    public static void main(String[] args) {

        launch(args);

    }



    @Override

    public void start(Stage primaryStage) throws Exception {

        // 字色的设置

        System.setProperty("prism.lcdtext" , "false" );



        // 场景图

        HBox root = new HBox();



        // 图

        init(); // 读取声音文件的信息到values

        root.getChildren().add(createLineChart()); // 折线



        // 现场

        Scene scene = new Scene(root, 900, 300);



        // 窗口

        primaryStage.setScene(scene);

        primaryStage.show();

    }



    /**

     * 读取声音文件的信息到values

     * @throws IOException

     * @throws UnsupportedAudioFileException

     */

    public void init() throws Exception {

        // 获取AudioInputStream

        File file = new File(fileName);

        AudioInputStream is = AudioSystem.getAudioInputStream(file);



        // 获取Format信息

        format = is.getFormat();

        System.out.println(format.toString());

        System.out.println("采样率:" + format.getSampleRate());

        System.out.println("帧大小:" + format.getFrameSize());

        System.out.println("样本大小:" + format.getSampleSizeInBits());



        // 计算获取的样本数

        // 指定时间的样本数

        int mount = (int) (format.getSampleRate() * sec);



        // 读取声音数据

        values  = new int[mount];

        for(int i = 0; i < mount; i ++) {

            // 1帧的大小

            int size = format.getFrameSize();

            byte[] data = new byte[size];

            int readedSize = is.read(data);



            // 读取失败时

            if( readedSize == -1 ){

                break;

            }



            // SampleSizeInBits

            switch( format.getSampleSizeInBits() ) {

                case 8:

                    values[i] = (int) data[0];

                    break;

                case 16:

                    values[i] = (int) ByteBuffer.wrap(data).order(ByteOrder.LITTLE_ENDIAN).getShort();

                    break;

                default:

                    break;

            }

        }



        // 关闭AudioInputStream

        is.close();

    }



    /**

     * 用折线图表示

     * @return Node

     */

    @SuppressWarnings("unchecked")

    public Node createLineChart() {

        // 折线图

        NumberAxis xAxis = new NumberAxis();

        NumberAxis yAxis = new NumberAxis();

        LineChart<Number, Number> chart = new LineChart<Number, Number>(xAxis, yAxis);

        chart.setMinWidth(900);



        //生成数据

        Series<Number, Number> series1 = new Series<Number, Number>();

        series1.setName("声道1");

        for(int i = 0; i < values.length; i ++) {

            series1.getData().add(new XYChart.Data<Number, Number>(i, values[i]));

        }



        // 登录数据

        chart.getData().addAll(series1);

        // 设置标题

        String title = String.format("『%s』的波形数据(采样率:%.1fHz)", fileName, format.getSampleRate());

        chart.setTitle(title);



        // 调整外观

        chart.setCreateSymbols(false); // 去掉符号

        series1.getNode().lookup(".chart-series-line").setStyle("-fx-stroke-width: 1px;"); // 细线



        return chart;

    }

}

 

执行结果

PCM_SIGNED 44100.0 Hz, 16 bit, stereo, 4 bytes/frame, little-endian

采样率:44100.0

帧大小:4

样本大小:16

PCM_SIGNED 44100.0 Hz, 16 bit, stereo, 4 bytes/frame, little-endian

采样率:44100.0

帧大小:4

样本大小:16


wav文件结构

 

© 著作权归作者所有

共有 人打赏支持
放个屁
粉丝 123
博文 176
码字总数 285078
作品 0
日本
程序员
python数据建模分析 - 语音识别

语音识别: Getting Started!首先,我们要知道语音的产生过程 voice.png 状态:由肺产生向外的气流,完全放松时声带张开,就是平时的呼吸。如果声带一张一合(振动)形成周期性的脉冲气流。这个...

语落心生 ⋅ 2017/08/07 ⋅ 0

matlab 滤波器

三,滤波器设计: 1、相关原理: 设计数字滤波器的任务就是寻求一个因果稳定的线性时不变系统,并使系统函数H(z)具有指定的频率特性。 数字滤波器从实现的网络结构或者从单位冲激响应分类,可...

找一片天空散步 ⋅ 2012/12/06 ⋅ 0

Android系统音频开发遇到的几个问题,求指点

最近在Android系统上做一款APP,需要和硬件外设(基于HiJack)做数据交互,外设采集到业务数据并通过音频口将数据传给APP,同时App通过音频口输出符合硬件要求的波形来给外设供电。 外设向手...

andywster ⋅ 2013/09/17 ⋅ 3

Verilog作业(二)

〇、关于本文 本文我的Verilog课程作业,由于我尚处在初学阶段,并且这门课和我实际工作的关系并不大,因此代码仅供参考。 我使用的编译环境为iverilog,在Windows下运行。 一、将一个波形的...

北风其凉 ⋅ 2014/06/11 ⋅ 0

51单片机红外解码程序

声明部分内容摘自: http://www.hificat.com/dpjstep/compositive7.html http://www.ceet.hbnu.edu.cn/bbs/viewthread.php?tid=102 1、红外遥控系统 通用红外遥控系统由发射和接收两大部分组...

Jay-zone ⋅ 2010/12/03 ⋅ 2

I2S音频总线学习(一)数字音频技术

IIS音频总线学习(一)数字音频技术 一、声音的基本概念 声音是通过一定介质传播的连续的波。 图1 声波重要指标: 振幅:音量的大小 周期:重复出现的时间间隔 频率:指信号每秒钟变化的次数...

长平狐 ⋅ 2013/06/03 ⋅ 0

我领导让我写一个二进制的文件

里面要求的格式是这样的。。 每种车型的每个车号都有这三种文件,各自结构如下: .pst: 每个车型的每个车号大概有1~3个.pst文件 一堆字符串,每个串为本车的.pcp文件的完整路径文件名 此文件...

未满灬18岁 ⋅ 2013/07/18 ⋅ 5

射频识别技术漫谈(32)——曼侧斯特码与FM0编码的防冲突原理

【转自】http://blog.sina.com.cn/s/blog9ed067ad0102vyl6.html 在RFID技术中,从低频的125KHz、134.2KHz到高频的13.56MHz,再到超高频和微波段的433MHZ、860-960MHz、2.45GHZ,研究标签向读...

wxh0000mm ⋅ 03/29 ⋅ 0

音频数据文件格式(PCM,WAV,MIDI)简记

PCM(Pulse Code Modulation):脉冲编码调制 把声源数据按一定的频率进行脉冲调制进行存储的数据格式,简单来说就是对模拟声音信号的数字 转换。 WAV WAV是一种无损音频数据格式。WAV符合RIF...

lengxujun ⋅ 2016/08/26 ⋅ 0

android 写入的pcm数据为什么不能播放

下面是写的pcm文件;但是不出声音;在硬件那里测试也不出波形;但录音的pcm数据能出波形;也能出声音;求高手解决;谢谢各位 fileName = new File("E:/write2.pcm"); char value=65407; char...

weng4570 ⋅ 2013/08/29 ⋅ 1

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Jenkins实践3 之脚本

#!/bin/sh# export PROJ_PATH=项目路径# export TOMCAT_PATH=tomcat路径killTomcat(){pid=`ps -ef | grep tomcat | grep java|awk '{print $2}'`echo "tom...

晨猫 ⋅ 今天 ⋅ 0

Spring Bean的生命周期

前言 Spring Bean 的生命周期在整个 Spring 中占有很重要的位置,掌握这些可以加深对 Spring 的理解。 首先看下生命周期图: 再谈生命周期之前有一点需要先明确: Spring 只帮我们管理单例模...

素雷 ⋅ 今天 ⋅ 0

zblog2.3版本的asp系统是否可以超越卢松松博客的流量[图]

最近访问zblog官网,发现zlbog-asp2.3版本已经进入测试阶段了,虽然正式版还没有发布,想必也不久了。那么作为aps纵横江湖十多年的今天,blog2.2版本应该已经成熟了,为什么还要发布这个2.3...

原创小博客 ⋅ 今天 ⋅ 0

聊聊spring cloud的HystrixCircuitBreakerConfiguration

序 本文主要研究一下spring cloud的HystrixCircuitBreakerConfiguration HystrixCircuitBreakerConfiguration spring-cloud-netflix-core-2.0.0.RELEASE-sources.jar!/org/springframework/......

go4it ⋅ 今天 ⋅ 0

二分查找

二分查找,也称折半查找、二分搜索,是一种在有序数组中查找某一特定元素的搜索算法。搜素过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜素过程结束;如果某一特定元素大于...

人觉非常君 ⋅ 今天 ⋅ 0

VS中使用X64汇编

需要注意的是,在X86项目中,可以使用__asm{}来嵌入汇编代码,但是在X64项目中,再也不能使用__asm{}来编写嵌入式汇编程序了,必须使用专门的.asm汇编文件来编写相应的汇编代码,然后在其它地...

simpower ⋅ 今天 ⋅ 0

ThreadPoolExecutor

ThreadPoolExecutor public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, ......

4rnold ⋅ 昨天 ⋅ 0

Java正无穷大、负无穷大以及NaN

问题来源:用Java代码写了一个计算公式,包含除法和对数和取反,在页面上出现了-infinity,不知道这是什么问题,网上找答案才明白意思是负的无穷大。 思考:为什么会出现这种情况呢?这是哪里...

young_chen ⋅ 昨天 ⋅ 0

前台对中文编码,后台解码

前台:encodeURI(sbzt) 后台:String param = URLDecoder.decode(sbzt,"UTF-8");

west_coast ⋅ 昨天 ⋅ 0

实验楼—MySQL基础课程-挑战3实验报告

按照文档要求创建数据库 sudo sercice mysql startwget http://labfile.oss.aliyuncs.com/courses/9/createdb2.sqlvim /home/shiyanlou/createdb2.sql#查看下数据库代码 代码创建了grade......

zhangjin7 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部