解析matlab的audioread()输入输出参数

news2024/9/20 16:36:20

目录

一、API简介

二、实验

1. matlab

2.  C语言


一、API简介

链接如下:

读取音频文件 - MATLAB audioread- MathWorks 中国

也可以浏览最新的英文版API说明:

 简单说明如下:

1. 读取wav格式的文件,会自动跳过44个字节的文件头

2. audioread()使用来代替wavread()的,新版本的Matlab已经不再支持wavread();所以在使用的时候需要注意返回的参数:wavread()返回三个参数,而audioread()只返回两个参数,少了“位深度”这个信息。

3. audioread()读出来的音频数据流有“归一化”操作,默认是除以32768归一化每个样本点,之后用double类型空间进行存储。

例如:假设对于一个音频文件,每个样本点都是用16位来量化而得到的数字信号,一般是用short类型进行存储,用audioread()读出来后,每个样本点其实都做了归一化, 比如对于数值为-417的样本点, 读出来的值是-417/(32768.0)=0.012725830078125,约为0.01273。

4. 如果不希望归一化,则第二个参数可设置为native,调用形式为:

[x,fs] = audioread('input.wav', native);

二、实验

假设音频源来自一个音频文件,采样率是8KHz,16bit的单声道数据。

1. matlab

[x,fs] = audioread('input.wav'); %自动跳过44个字节的文件头

fprintf('fs:%d\n', fs)

fprintf('row:%d\n', size(x, 1))%矩阵的行数

fprintf('col:%d\n', size(x, 2))%矩阵的列数


len=256;

noise_mean = zeros(len,1);


j=1;

noise_mean = x(j:j+len-1); %读取前面256个样本点

audiowrite('outFile.wav', x, fs);

noise_mean这个矩阵的值如下:

 假设不进行归一化操作:

[x,fs] = audioread('input.wav', 'native'); %自动跳过44个字节的文件头

fprintf('len(x):%d\n', size(x))%28019

len=256

noise_mean = zeros(len,1);

j=1;

noise_mean = x(j:j+len-1) %读取前面256个样本点

audiowrite('outFile.wav', x, fs);

noise_mean这个矩阵的值如下:

 注:

(1) 这就是最原始的音频数据,可以手动验算该API的“归一化数值”操作。

(2)可以直接用C语言读出,进行对比。

2.  C语言

#define _CRT_SECURE_NO_WARNINGS
#include <stdlib.h>
#include <stdio.h>

int main(void)
{
	int i;
	int count=0;

	FILE *fpin = fopen("input.wav", "rb");
	if (fpin == NULL) {
		printf("input data read fail\n");
		return 0;
	}

	fseek(fpin, 0, SEEK_END);
	long inputdata_length = ftell(fpin);
	//偏移,跳过文件头
	inputdata_length = inputdata_length - 44;
	inputdata_length /= 2;
	printf("input_file_len:% ld\n", inputdata_length);
	rewind(fpin);

	short* x = (short*)calloc(inputdata_length, sizeof(short));

	//偏移,跳过文件头
	fseek(fpin, 44, SEEK_SET);

	count = fread(x, sizeof(short), inputdata_length, fpin);
	printf("count:% d\n", count);

	for (i = 0; i < 256; i++) {
		printf("x_tmp[%d]=%d\n", i, x[i]);
	}

	return 0;
}

打印如下:

input_file_len: 28019

count: 28019

x[0]=-417

x[1]=-14

x[2]=-17

x[3]=-112

x[4]=1319

x[5]=1512

x[6]=-987

x[7]=-1046

x[8]=550

x[9]=342

x[10]=212

x[11]=-182

x[12]=192

x[13]=175

x[14]=-1268

x[15]=-952

x[16]=-786

x[17]=-759

x[18]=473

x[19]=950

x[20]=603

....................................................

实际算法开发,为防止计算过程中,数据过大,一般也会做归一化操作。注意,读取实际音频数据长度,以及读出实际音频数据之前,都要先跨过文件头(如果是PCM格式,就不需要)。

完整示例代码:

#define _CRT_SECURE_NO_WARNINGS
#include <stdlib.h>
#include <stdio.h>

int main(void)
{
	int i;
	int count=0;

	FILE *fpin = fopen("input.wav", "rb");
	if (fpin == NULL) {
		printf("input data read fail\n");
		return 0;
	}

	FILE *fpout = fopen("output.wav", "wb");
	if (fpin == NULL) {
		printf("open output file fail\n");
		return 0;
	}

	fseek(fpin, 0, SEEK_END);
	long inputdata_length = ftell(fpin);
	//偏移,跳过文件头
	inputdata_length = inputdata_length - 44;
	inputdata_length /= 2;
	printf("input_file_len:% ld\n", inputdata_length);
	rewind(fpin);

	short* x = (short*)calloc(inputdata_length, sizeof(short));

	//偏移,跳过文件头
	fseek(fpin, 44, SEEK_SET);

	count = fread(x, sizeof(short), inputdata_length, fpin);
	printf("count:% d\n", count);

//	for (i = 0; i < 256; i++) {
//		printf("x[%d]=%d\n", i, x[i]);
//	}

#if 0  /* 无数值归一化操作 */
	fwrite(x, sizeof(short), inputdata_length, fpout);
	free(x);
	fclose(fpin);
	fclose(fpout);
#else	/* 进行数值归一化操作 */

	float* x_in = (float*)calloc(inputdata_length, sizeof(float));
	short* x_out = (short*)calloc(inputdata_length, sizeof(short));
	//输入
	for(i=0; i<inputdata_length; i++) {
		x_in[i]=x[i]/32768.0;
	}

	//处理

	//输出
	for(i=0; i<inputdata_length; i++) {
		x_out[i]=(short)(x_in[i]*32768.0);
	}

	fwrite(x_out, sizeof(short), inputdata_length, fpout);
	free(x);
	free(x_in);
	free(x_out);
	fclose(fpin);
	fclose(fpout);
#endif

	return 0;
}

输出的音频文件和源文件一致:

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/709103.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

初识React/JSX/组件/state/受控组件

JSX 推荐使用小括号包裹jsx 使用函数创建组件 使用类创建组件 抽离组件 事件绑定 事件对象 有状态和无状态组件/state 抽离事件处理程序 表单元素 受控组件 多表单优化 非受控组件(了解即可)

vhost-net-原理-初始化流程-数据传输流程-vhost-net后端

文章目录 1.vhost net2.vhost-net的初始化流程vhost net设置vhost dev设置vhost vring设置 3.数据收发流程分析3.1 数据发送3.2 数据接收 4ioventfd和irqfd的通知机制4.1ioeventfdqemu侧kvm侧总体效果 4.2irqfdqemu侧kvm侧总体效果 参考&#xff1a; 1.vhost net 传统的virtio…

ChatGPT Plugins内幕、源码及案例实战(一)

ChatGPT Plugins内幕、源码及案例实战 6.1 ChatGPT Plugins的工作原理 本节主要跟大家谈ChatGPT的插件(Plugins),这个内容非常重要。现在很多企业级的开发,一般都会基于ChatGPT 插件进行一些服务的封装,相当于开发了一个代理(Agent),把一些服务或者API封装在里面,然后…

eclipse编辑器汉化;eclipse安装中文插件

eclipse IDE默认是英文环境&#xff0c;使用起来略微不便&#xff0c;汉化还是很有必要的&#xff1b;下面记录一下安装中文插件的过程: 文章目录 一、 选择安装包地址二、 在eclipse安装中文插件2.1 在线安装2.2 手动下载安装包2.3 导入到eclipse 三、汉化插件介绍 一、 选择安…

实例005 可以拉伸的菜单界面

实例说明 如果管理程序功能菜单非常多&#xff0c;而用户只使用一些常用菜单&#xff0c;这时&#xff0c;可以将主菜单项下的不常用菜单隐藏起来。此种显示方式类似于对菜单进行拉伸。使用时&#xff0c;只需单击展开菜单&#xff0c;即可显示相应菜单功能。运行本例&#xf…

python matplotlib中colorbar的位置设置

colorbar单独设置一个轴对象&#xff0c;再对轴对象进行灵活设置 import numpy as np import matplotlib.pyplot as plt# 创建一个二维随机数组 data np.random.rand(10, 10)# 创建一个图形和一个子图 fig, ax plt.subplots()# 绘制热力图 heatmap ax.imshow(data, cmaphot…

在linux中快速安装Redis数据库

Redis中文网 点击该链接下载最5.0.4版本的Redis的压缩包 使用Xftp工具将Redis安装包上传到linux中 1.将压缩包解压到/opt目录下: tar -zxvf redis-5.0.4.tar.gz 2. 更新yun: sudo yum makecache fast 3.安装gcc: yum -y install gcc 4.安装完成通过输入 : gcc -v …

tiny tool - get_file_path_name_by_drop_file

文章目录 tiny tool - get_file_path_name_by_drop_file概述工程效果收获的知识点vs2022工程, 必须自己设置对话框可以接受文件的风格vs2022建立的工程, 默认是unicode编码, 设置剪贴板数据时, 必须要设置为unicode的格式, 否则剪切板中只有第一个字符工程主要实现END tiny too…

短信压力测试系统,支持自定义接口

短信压力测试系统,支持自定义接口 支持卡密充值&#xff0c;短信压力测试系统&#xff0c;解决一切骚扰电话&#xff0c;教程在压缩包里面 可多个服务器挂脚本分担压力&#xff0c;套了cdn导致无法正常执行脚本可以尝试添加白名单 这边建议使用MySQL方式 同服务器下直接配置…

MySQL生产环境高可用架构实战

分布式技术MongoDB 1. MySQL高可用集群介绍1.1 数据库主从架构与分库分表1.2 MySQL主从同步原理 2. 动手搭建MySQL主从集群2.1 基础环境搭建2.2 安装MySQL服务2.2.1 初始化MySQL2.2.2 启动mysql2.2.3 连接MySQL 2.3 搭建主从集群2.3.1 配置master主服务2.3.2 配置slave从服务主…

Radzen Blazor Studio 1.12 Crack

Radzen Blazor Studio 是一款桌面工具&#xff0c;使 开发人员 能够创建精美的商业 Blazor 应用程序。快速地。 开放技术栈 没有供应商锁定。生成的源代码是人类可读的&#xff0c;您可以使用免费工具构建它。 Radzen 由流行的开源技术 - ASP.NET Core、Blazor、Bootstrap 提供…

较少的分区也报错too many range table entries

问题现象 postgresql中update执行语句报错too many range table entries 源sql with t as (select id from LZLTAB where id8723 limit 100 ) update LZLTAB setSTATUS 00,FILE_ID null,DATE_UPDATED localtimestamp(0) where id in (select id from t)如果把update改写成…

碳排放预测模型 | Python实现基于机器学习的碳排放预测模型——数据清理和可视化

文章目录 效果一览文章概述研究内容源码设计参考资料效果一览 文章概述 碳排放预测模型 | Python实现基于机器学习的碳排放预测模型——数据清理和可视化 研究内容 碳排放被认为是全球变暖的最主要原因之一。 该项目旨在提供各国碳排放未来趋势的概述以及未来十年的全球趋势预测…

三维空间刚体运动之旋转矩阵与变换矩阵

1. 旋转矩阵 1.1 点、向量和坐标系 点&#xff1a;点是空间中的基本元素&#xff0c;没有长度&#xff0c;没有体积&#xff1b; 向量&#xff1a;把两个点连接起来&#xff0c;就构成了向量&#xff0c;向量可以看成从某点指向另一点的一个箭头&#xff1b;只有当我们指定这…

threejs精灵和粒子系统

个人博客地址: https://cxx001.gitee.io 前面我们了解到了场景中的网格对象由几何体和材质组成&#xff0c;并且分别系统学习了它们。这节我们将学习一个特殊的网格对象-----粒子(精灵)。 了解粒子 一个粒子(新版叫精灵)是 一个二维平面(小方块) &#xff0c;它总是面向摄像…

Linux--阅读文本指令:more、less

生成10000行数字并将其写入普通文件的指令&#xff1a; count0; while [ $count -le 10000 ]; do echo "hello bit ${count}"; let count; done > file.txt 直接cat < file.txt会刷屏的&#xff0c;故引入more 注&#xff1a;enter键控制下翻&#xff0c;q直…

拷贝对象,拷贝快乐:揭开JavaScript中拷贝的神奇面纱

文章目录 浅拷贝&#xff08;Shallow Copy&#xff09;1. 使用 Object.assign() 方法2. 使用展开运算符&#xff08;Spread Operator&#xff09;3. 使用数组的 slice() 或 concat() 方法 深拷贝&#xff08;Deep Copy&#xff09;1. 使用 JSON 对象的方法2. 使用递归方法自行实…

@validated的自定义注解校验编程式校验

自定义注解校验 前面的文章中&#xff0c;我们都是采用validate机制自带的条件注解来进行参数校验&#xff0c; 比如Min、NotNull…等等&#xff0c; 这些的确可以帮我们省去一部分的参数校验&#xff0c;可惜还有一部分的业务校验规则并不是如这般简单的&#xff0c; 比如前端…

C++ 程序设计入门

✅作者简介&#xff1a;人工智能专业本科在读&#xff0c;喜欢计算机与编程&#xff0c;写博客记录自己的学习历程。 &#x1f34e;个人主页&#xff1a;小嗷犬的个人主页 &#x1f34a;个人网站&#xff1a;小嗷犬的技术小站 &#x1f96d;个人信条&#xff1a;为天地立心&…

mybatis web使用01

CREATE TABLE t_act ( id bigint auto_increment, actno varchar(255) NOT NULL, balance int(11) default 0, PRIMARY KEY (id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 创建 maven web 工程 在 IntelliJ IDEA 上使用 Maven 创建 web 工程的步骤如下&#xff1a; 在…