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

news/2024/10/17 12:29:16/

从本文开始将记录一些简单的音频信号处理算法在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.ppmy.cn/news/51179.html

相关文章

Nmap学习简记

Nmap主机发现 nmap -sn CIDR 对该网络中的所有主机进行ip扫描,以此来发现网络主机存活。 Nmap主机发现结果输出 nmap -sn CIDR -oX test.xml 将扫描结果输出到test.xml文件中方便以后使用。 Nmap端口探测技巧 nmap -p80 DNS 对某个端口进行探测 nmap -p80,…

【工作总结】后端开发人员的坏习惯

文章目录 前言一、不遵循项目规范二、用复杂SQL语句来解决问题三、缺少全局把控思维,只关注某一块业务四、函数复杂冗长,逻辑混乱五、缺乏主动思考,拿来主义六、核心业务逻辑,缺少相关日志和注释七、修改代码,缺少必要测试八、需求没理清&…

Yolov8损失函数改进:Wasserstein Distance Loss,助力小目标涨点

论文名称:《A Normalized Gaussian Wasserstein Distance for Tiny Object Detection》 作者:Jinwang Wang、Chang Xu、Chang Xu、Lei Yu 论文地址:https://arxiv.org/abs/2110.13389 小目标检测是一个非常具有挑战性的问题,因为小目标只包含几个像素大小。作者证明,由于…

【Python】【进阶篇】9、Django路由系统精讲

目录 Django路由系统精讲1. Django 路由系统应用1)配置第一个URL实现页面访问2)正则与正则分组使用3)正则捕获组使用 2. path()与re_path() Django路由系统精讲 在《URL是什么》一节中,我们对 URL 有了基本的认识,在本…

mybatis3源码篇(1)——构建流程

mybatis 版本:v3.3.0 文章目录 构建流程SqlSessionFactoryBuilderXMLConfigBuildertypeAliasesElementtypeHandlerElementmapperElementMapperRegistry MappedStatementMapperAnnotationBuilderXMLMapperBuilderMapperBuilderAssistant SqlSessionFactorySqlSession…

数据结构(数组、链表、栈、队列、树)

文章目录 1.数组1.1数组的特点1.2自定义数组 2.链表2.1链表的特点2.2自定义链表2.2.1自定义单向链表2.2.2自定义双向链表 3.栈3.1栈的特点3.2 Stack使用举例3.3 自定义栈 4. 队列5. 树与二叉树5.1 树的理解5.2 二叉树的基本概念5.3 二叉树的遍历5.4 经典二叉树和红黑树5.5 二叉…

SEO机制算是让我玩明白了

获取当前时间时间戳,返回遵循ISO 8601扩展格式的日期 new Date(Date.now()).toISOString() 使用moment库转换回来 this.moment(new Date(Date.now()).toISOString()).format("YYYY-MM-DD") js去掉富文本中html标签和图片 filterHtmlTag(val) {if(!val){…

苦中作乐 ---竞赛刷题31-40(15-20)

(一)目录 L1-032 Left-pad L1-033 出生年 L1-034 点赞 L1-035 情人节 L1-039 古风排版 (二)题目 L1-032 Left-pad 根据新浪微博上的消息,有一位开发者不满NPM(Node Package Manager)的做法…