【FPGA-DSP】第九期:音频信号处理

news2024/10/6 12:27:02

从本文开始将记录一些简单的音频信号处理算法在System Generator中的实现方法。本文将介绍如何搭建音频信号的采集与输出模型。

音频信号属于一维信号,一些基本概念如下:

  • 采样频率:根据奈奎斯特采样定理,采样频率Fs应该不低于声音信号中最高频率2倍。常见的音频格式文件(如mp3、wav等)有几个固定的采样频率:11025Hz、22050Hz、44100Hz、48000Hz。
  • 量化精度:即每个声音样本用多少位(bit)表示。通常以字节为单位。
  • 声道:现在的音频文件几乎都是立体声(左声道、右声道),也可以用“格式工厂”等工具转换为单声道。

现在单声道的音频文件很难找,因此使用“格式工厂”将立体声音频文件转换为单声道音频文件,用于设计仿真。System Generator和Gateway In的采样频率设置为48000Hz,仿真时长设置为5s,即只采集和输出5s的音频信号。

本设计采集到音频信号后不做任何处理直接输出,播放输出的音频文件。

1. 音频文件的采集

1.1 通过matlab导入音频数据

我们需要将下载的双声道文件通过matlab转化成单声道文件

%% 音乐信号处理
Music = audioinfo("music.mp3"); 
[Music_audio,Fs] = audioread("music.mp3");
Music_one_channel = Music_audio(:,1); %获取单声道
Music_length = length(Music_one_channel);

T = 10; %音乐持续时间
T_start = 34; %音乐开始时间
N = Fs*T;
N_start = Fs*T_start; %开始时的样本点数
t = 1:1:N; %持续的样本点数

Music_in(:,1) = 1:N; %输入信号的第一列表示样本点数
Music_in(:,2) = Music_one_channel(N_start:N_start+N-1); %输入信号的第二列表示单通道的音乐信息

sound(Music_in(:,2),Fs); %播放验证一下

plot一下看看信号幅度谱

%% 图像输出
plot(t,Music_in(:,2)),xlabel('音频信号的采样点数'),ylabel('音频信号的幅度谱');

1.2 通过system generator导入音频数据

在simulink中添加From Multimedia File模块来读取我们的音频数据

Simulink的Audio System Toolbox中包含了与音频相关的block。上图中的From Multimedia File的作用是读取音频文件,音频文件的相关信息会显示在图标上(mono即表示单声道,stero为双声道)

“File name”中选择音频文件路径;“Number of times to play file”设置从文件中读取的音频信号时间;“Samples per audio channel”设置每个通道读取出的采样点数。音频信号需要通过Gateway In输入到FPGA,但Gateway In不能接收向量型数据,因此这个值通常设置为1更方便。

如果From Multimedia File读取的是立体声音频文件,会以向量的形式输出数据。如果把立体声音频信号直接接到Gateway In会提示如下错误:

这里写图片描述

System Generator block只支持标量数据类型。Gateway In的图标中输入数据也变成了“?”。需要采集立体声音频时,必须用demux这个block将各声道的音频分开,分别进行信号处理。模型如下图: 

 

2. system generator设计

为了读取工作区中的变量,我使用simulink中的from/to workspace来读取和导出数据。 

2.1 音频信号的降采样和升采样

信号降采样等效于将音频信号加速处理 

将输出导入到工作区后,通过matlab进行读取

%% Simulink
output_simulink = out.output.data;
sound(output_simulink,Fs); %播放验证一下

可以发现,声音被加速了一倍,同样的,如果或我们使用升采样,那么等效于慢速播放

再在matlab中运行,可以发现相较于原始音频而言,经过两次采样操作之后音质下降 

2.2 音频信号的频谱分析

参考(244条消息) 【FPGA-DSP】第五期:FFT调用流程_fft流程_༜黎明之光༜的博客-CSDN博客 

我们使用的是简化的FFT block

FFT参数设置 

 

注意:一定要将Natural Order给勾选上。除非你知道FFT输出的顺序如何确定,否者按照自然顺序输出。 

示波器输出结果如下: 

 

将Simulink导入到工作区的变量在matlab中进行 

可以发现经过FFT过后的数据在8377个样本点之后才会有输出,matlab的信号处理如下: 

 

 

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

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

相关文章

Vite vue 使用cdn引入element-plus

vite-plugin-cdn-import:cdn的引入插件 npm i vite-plugin-cdn-import or pnpm i vite-plugin-cdn-import vite.config.js import AutoImport from unplugin-auto-import/viteexport default defineConfig({ plugins: [vue({reactivityTransform: true}),importT…

0401概述-最短路径-加权有向图-数据结构和算法(Java)

文章目录 1 最短路径2 最短路径的性质3 加权有向图的数据结构3.1 加权有向边3.2 加权有向图 4 最短路径4.1 最短路径API4.2 最短路径的数据结构4.3 边的松弛4.4 顶点的松弛 结语 1 最短路径 如图1-1所示,一幅加权有向图和其中的一条最短路径: 定义&…

事务—MySQL

文章目录 1.事务的四大特性1.1原子性1.2一致性1.3隔离性1.4持久性 2.并发访问中存在的一些问题2.1丢失更新2.2脏读2.3不可重复读2.4幻读 3.隔离级别解决一致性的问题3.1未提交读3.2提交读3.3可重复读3.4可串行化 4.不同隔离级别可以解决的问题 1.事务的四大特性 1.1原子性 事…

BBR原版/魔改/plus/锐速/七合一脚本linux加速脚本/硬盘挂载/cc防御/宝塔

BBR原版/魔改/plus/锐速七合一脚本linux加速脚本/硬盘挂载/CC防御/宝塔 新云分享的七合一脚本,包含原版BBR、魔改BBR、bbrplus以及锐速可选。 在vultr上Centos 7, Debian 8/9, Ubuntu 16/18测试通过,不支持ovz。 安装指令:复制下面命令在s…

Openswan安装和简单配置

Openswan安装和简单配置 安装环境: 操作系统:Ubuntu20.0.4TLS 用户权限:root下载Openswan: wget https://github.com/xelerance/Openswan/archive/refs/tags/v3.0.0.zip安装Openswan: 解压Openswan:(PS&#xff1a…

[golang gin框架] 26.Gin 商城项目-前台自定义商品列表模板, 商品详情数据渲染,Markdown语法使用

一.前台自定义商品列表模板 当在首页分类点击进入分类商品列表页面时,可以根据后台分类中的分类模板跳转到对应的模板商品列表页面 1.管理后台商品分类模板设置如下图所示 2.代码展示 (1).商品控制器方法Category()完善 修改controllers/frontend/productController…

大模型竞逐,再造AI新格局

作者 | 辰纹 来源 | 洞见新研社 “面对AI时代,所有产品都值得用大模型重做一次。” 这是阿里巴巴集团董事会主席兼CEO、阿里云智能集团CEO张勇在2023阿里云峰会上对AIGC(生成式AI)进化的判断,在这背后则是由ChatGPT为起始点&…

Shiro学习笔记,一篇就够用了

目录 一、Shiro基础 1.1Shiro定义: 1.2Shiro架构: 1.3快速上手: 二、Spring整合Shiro 2.1导入spring整合shiro的依赖 2.2两个配置类 寻找maven版本号:Maven Repository: org.apache.shiro shiro-core (mvnrepository.com) Shiro官网:Apache Shiro | Simple. Java. Securi…

C. Trailing Loves (or L‘oeufs?)(求某个质因子在n的阶乘中的个数 + 思维)

Problem - C - Codeforces Aki喜欢数字,尤其是那些带有尾随零的数字。例如,数字9200有两个尾随零。Aki认为数字拥有的尾随零越多,它就越漂亮。 然而,Aki认为,一个数字拥有的尾随零的数量并不是固定的,而是…

微搭低代码调用第三方API

目录 1 创建项目2 获取实时天气API3 创建APIs4 小程序中调用总结 应粉丝要求,我们本篇介绍一下微搭中如何调用第三方API。我们的应用开发中比较常见的一类需求是开发一个天气的功能,方便用户访问应用的时候实时的看到今天最新的天气情况。 第三方的天气…

虚拟机安装使用经验

1 VMware 跟 VirtualBox 在网络上可以看到很多对比的资料,比如这篇: VirtualBox 和 VMware的区别 VMware 分商业版跟非商业版,我们这里仅讨论非商业版,也就是 VMware Workstation Player,支持在 Linux、Windows、Mac OS 等系统上…

docker容器:Docker consul的容器服务更新与发现

目录 一、Docker consul 1、什么是服务注册与发现 2、什么是consul 3、consul部署 ①实验目的 ②实验环境及拓扑 ③consul配置 ④registrator后端配置 ⑤测试发现功能是否正常 4、consul-template部署 ①准备template nginx模板文件 ②编译安装nginx ③安装templa…

LVS-keepalived

文章目录 一、keepalived1、KEEPALIVED作用2、KEEPALIVED原理3、KEEPALIVED工作模式4、KEEPLIVED问题及优化 二、实验1.LVSKeepalived 高可用群集 总结 一、keepalived 1、KEEPALIVED作用 保证负载均衡的高可用性,完美解决了LVS所有问题,可以检查后端服…

【随笔】转发/转向(服务器重定向,服务器转发,服务器跳转)和重定向(客户端重定向,客户端转发,客户端跳转)

文章目录 1.转发(转向)和重定向图解2.例子3.区别 1.转发(转向)和重定向图解 图:转发(转向) 图:重定向 2.例子 转发:A找B要钱,B没钱,于是B向C…

OSPF路由协议解释

目录 OSPF路由协议OSPF数据包类型OSPF邻区状态OSPF的邻接关系建立过程 路由名词解释OSPF开源项目 OSPF路由协议 OSPF简介 1、(Open Shortest Path First),开放式最短路径优先,它属于链路状态路由协议,大部分路由将由O…

ChatGPT进化的过程简介

Chat GPT可以做什么? 分点列条的回答问题 写代码或SQL 翻译 语法检查 ChatGPT官方还未公开论文,ChatGPT有一个“孪生兄弟”InstructGPT,InstructGPT有论文,可以根据InstructGPT论文推导ChatGPT的训练过程: ChatGPT的…

React函数组件语法(N)

文章目录 react学习的说明新的官网全力投入现代React与Hooks React简介概述官网特点生态 React脚手架create-react-app官网创建和启动项目项目结构sass支持 Vite创建和启动项目项目结构常见配置 虚拟DOM什么是虚拟DOM虚拟DOM优缺点优点:缺点: 虚拟DOM实现…

MySQL死锁的原因和处理方法

MySQL死锁的原因和处理方法 表的死锁产生原因解决方案 行级锁死锁产生原因1解决方案1产生原因2产生原因3解决方案 表的死锁 产生原因 用户A访问表A(锁住了表A),然后又访问表B;另一个用户B访问表B(锁住了表B),然后企图访问表A;这时用户A由于用户B已经锁住表B,它必须…

LeetCode349. 两个数组的交集

题目链接 LeetCode349. 两个数组的交集 题目描述 题解 题解一(Java) 作者:仲景 因为数据范围和长度都限制在1000,所以直接使用数组即可 因为数据范围和长度都在1000内,所以碰到数字可以直接arr[i] i来表示这个数字…

如何有效的开展接口自动化测试,一篇就行

一、简介 接口自动化测试是指使用自动化测试工具和脚本对软件系统中的接口进行测试的过程。其目的是在软件开发过程中,通过对接口的自动化测试来提高测试效率和测试质量,减少人工测试的工作量和测试成本,并且能够快速发现和修复接口错误&…