实验6

2023-10-27

一、MPEG-1 Audio LayerII编码器原理

在这里插入图片描述

1、多相滤波器组:将PCM样本变换到32个子带的频域信号

如果输入的采样频率为48kHz,那么子带的频率宽度为48/(2*32)=0.75Hz
在这里插入图片描述
缺点:
(1)等带宽的滤波器组与人类听觉系统的临界频带不对应
在低频区域,单个子带会覆盖多个临界频带。在这种情况下,量化比特数不能兼每个临界频带
(2)滤波器组与其逆过程不是无失真的
但滤波器组引入的误差差很小,且听不到
(3)子带间频率有混叠
滤波后的相邻子带有频率混叠现象,一个子带中的信号可以影响相邻子带的输出

2、心理声学模型:计算信号中不可听觉感知的部分

计算噪声遮蔽效应
(1)心理声学模型1:计算复杂度低,但对假设用户听不到的部分压缩太严重
(2)心理声学模型2 :提供了适合Layer III编码的更多特征
实际实现的模型复杂度取决所需要的压缩因子

3、比特分配器:根据心理声学模型的计算结果,为每个子带信号分配比特数

4、装帧:产生MPEG-I兼容的比特流

二、感知音频编码的设计思想

感知编码是利用人耳听觉的心理声学特性,将凡是人耳感觉不到的成分不编码不传送的一种编码技术。

1、绝对听觉门限

声源振动的能量通过声波传入人耳,使耳膜发生振动,人们就产生了声音的感觉。但是人耳能听到的振动频率约在20Hz到20KHz之间,低于20Hz或高于20KHz的振动,不能引起人类听觉器官的感觉。心理声学模型中一个基本的概念就是听觉系统中存在一个听觉阈值电平,低于这个电平的声音信号就听不到,因此就可以把这部分信号去掉。听觉阈值的大小随声音频率的改变而改变,各个人的听觉阈值也不同。一个人是否能听到声音取决于声音的频率,以及声音的幅度是否高于这种频率下的听觉阈值。

2、听觉掩蔽效应

一种频率的声音阻碍听觉系统感受另一种频率的声音的现象称为掩蔽效应。掩蔽可分成频域掩蔽和时域掩蔽。

(1)频域掩蔽

频域掩蔽是指掩蔽声与被掩蔽声同时作用时发生掩蔽效应,是一种较强的掩蔽效应。通常,频域中的一个强音会掩蔽与之同时发声的附近的弱音,弱音离强音越近,一般越容易被掩蔽。一般来说,低频的音容易掩蔽高频的音;在距离强音较远处,绝对听觉门限比该强音所引起的掩蔽阈值高,这时噪声的掩蔽阈值应取绝对听觉门限。

(2)时域掩蔽

在时间上相邻的声音之间产生的掩蔽现象称为时域掩蔽,即掩蔽效应发生在掩蔽声与被掩蔽声不同时出现。若掩蔽声音出现之前的一段时间内发生掩蔽效应,则称为导前掩蔽;否则称为滞后掩蔽。产生时域掩蔽的主要原因是人的大脑处理信息需要花费一定的时间,异时掩蔽也随着时间的推移很快会衰减,是一种弱掩蔽效应。

3、感知编/解码器

利用人耳的心理声学特性,可以设计相应的模块去除一些冗余信息,提高数据的压缩效率。
在这里插入图片描述

三、心理声学模型的实现过程

1、临界频带

由于声音频率与掩蔽曲线不是线性关系,为从感知上来统一度量声音频率,引入了 “临界频带”的概念。当某个纯音被以它为中心频率、且具有一定带宽的连续噪声所掩蔽时,如果该纯音刚好被听到时的功率等于这一频带内的噪声功率,这个带宽为临界频带宽度。通常认为,在20Hz到16kHz范围内有24个临界频带。

2、掩蔽值的计算

在这里插入图片描述
在这里插入图片描述

四、码率分配的实现思路

1、在调整到固定的码率之前

先确定可用于样值编码的有效比特数,这个数值取决于比例因子、比例因子选择信息、比特分配信息以及辅助数据所需比特数

2、比特分配的过程

(1)对每个子带计算掩蔽-噪声比MNR,是信噪比SNR–信掩比SMR,即:MNR = SNR–SMR
(2)NMR=SMR-SNR

3、算法:使整帧和每个子带的总噪声—掩蔽比最小

(1)计算噪声-掩蔽比( NMR): NMR = SMR – SNR (dB)
其中SNR 由MPEG-I标准给定 (为量化水平的函数) NMR:表示波形误差与感知测量之间的误差
(2)循环,直到没有比特可用
◼ NMR = SMR– SNR (dB)
◼ 对最高NMR的子带分配比特,使获益最大的子带的量化级别增加一级
◼ 重新计算分配了更多比特子带的NMR
在这里插入图片描述

五、程序设计

main函数主要作用:
1、过滤数据滑动窗口以获取 32 个子波段,即每个通道的样本
2、如果采用联合立体声模式,则将左右通道组合在一起
3、计算一帧的比例因子和比例因素选择信息
4、使用选定的心理声学模型计算心理声学掩蔽水平
5、使用第4步的掩蔽电平对低掩蔽比的子带执行迭转位分配
6、如果错误保护标志处于活动状态,则添加CRC纠错
7、将比特分配,比例因子和比例因子信息打包到比特流中
8、量化子带并将其打包到比特流中

int main (int argc, char **argv)
{
   
  typedef double SBS[2][3][SCALE_BLOCK][SBLIMIT];
  SBS *sb_sample;
  typedef double JSBS[3][SCALE_BLOCK][SBLIMIT];
  JSBS *j_sample;
  typedef double IN[2][HAN_SIZE];
  IN *win_que;
  typedef unsigned int SUB[2][3][SCALE_BLOCK][SBLIMIT];
  SUB *subband;

  frame_info frame;  //结构体,包含头信息、比特分配表、声道数等内容
  frame_header header;  //头信息
  char original_file_name[MAX_NAME_SIZE];  //输入文件名
  char encoded_file_name[MAX_NAME_SIZE];  //输出文件名
  short **win_buf;
  static short buffer[2][1152];
  static unsigned int bit_alloc[2][SBLIMIT], scfsi[2][SBLIMIT];  //存放2声道共32个子带的比特分配表
  static unsigned int scalar[2][3][SBLIMIT], j_scale[3][SBLIMIT];  //存放2声道、3组各子带的比例因子
  static double smr[2][SBLIMIT], lgmin[2][SBLIMIT], max_sc[2][SBLIMIT];
  // FLOAT snr32[32];
  short sam[2][1344];		/* was [1056]; */
  int model, nch, error_protection;
  static unsigned int crc;
  int sb, ch, adb;
  unsigned long frameBits, sentBits = 0;
  unsigned long num_samples;
  int lg_frame;
  int i;

  /* Used to keep the SNR values for the fast/quick psy models */
  static FLOAT smrdef[2][32];

  static int psycount = 0;
  extern int minimum;

  time_t start_time, end_time;
  int total_time;

  sb_sample = (SBS *) mem_alloc (sizeof (SBS), "sb_sample");
  j_sample = (JSBS *) mem_alloc (sizeof (JSBS), "j_sample");
  win_que = (IN *) mem_alloc (sizeof (IN), "Win_que");
  subband = (SUB *) mem_alloc (sizeof (SUB), "subband");
  win_buf = (short **) mem_alloc (sizeof (short *) * 2, "win_buf");

  /* clear buffers */
  memset ((char *) buffer, 0, sizeof (buffer));
  memset ((char *) bit_alloc, 0, sizeof (bit_alloc));
  memset ((char *) scalar, 0, sizeof (scalar));
  memset ((char *) j_scale, 0, sizeof (j_scale));
  memset ((char *) scfsi, 0, sizeof (scfsi));
  memset ((char *) smr, 0, sizeof (smr));
  memset ((char *) lgmin, 0, sizeof (lgmin));
  memset ((char *) max_sc, 0, sizeof (max_sc));
  //memset ((char *) snr32, 0, sizeof (snr32));
  memset ((char *) sam, 0, sizeof (sam));

  global_init ();  //全局初始化
  
  header.extension = 0;
  frame.header = &header;
  frame.tab_num = 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

实验6 的相关文章

  • V2X车联网-学习整理笔记

    一致性测试预备条件 1 具备WIFI或者LAN通信能力 2 具备GNSS能力 能够获取设备经纬度以及授时 3 具备RF通信能力 aid为应用标识 应用标识分配如下 111 普通车辆状态 112 普通车辆关键事件提醒 113 紧急车辆状态 1
  • 服务器维护 文档,ERP系统维护服务器维护管理文档.docx

    文档介绍 ERP系统机箱及办事器治理维护文档 作者 数据技能组 创建日期 2013 05 08 修他日期 版本 1 0 目录 目录 2 编写说明 3 使用东西 4 参考文档 4 图标说明 4 治理维护界面详细说明 5 治理维护界面的进入 6
  • gedit注释快捷建 ctrl+m

    sudo apt get install gedit plugins 安装gedit 插件 终端输入gedit命令 打开gedit 最后把code comment勾上 重启机器就可以使用Ctrl M注释了 Ctrl N 新开一个窗口新建文档
  • PyFlink使用说明:建表及连接Mysql数据库

    PyFlink1 16 0 使用说明 建表及连接Mysql数据库 引言 安装运行环境 PyFlink创建作业环境 一 创建一个 Table API 批处理表环境 二 创建一个 Table API 流处理表环境 三 创建一个 DataStre
  • css3 文本超出容器后显示...以及超出几行后显示...

    前言 好记性不如烂笔头 记录一下自己常用的css样式 一 文本超出容器后显示 div class ellipsis main 国际酒店政策国际酒店政策国际酒店政策国际酒店政策国际酒店政策 div ellipsis main width 10
  • error: The following untracked working tree files would be overwritten by checkout:

    1 可以使用 git status 查看什么情况 2 原因可能是这些变化没有提交 根据git status 的提醒 可以提交 然后就可以切换分支了 3 git checkout 你想切换的分支
  • 电商平台怎么搭建

    越来越多商家致力于搭建并运营自己的私域电商平台 大家都清楚了解拥有自己电商平台的好处 有利于品牌的塑造与提升 提高品牌曝光度和认知度 提高客户黏性 降低渠道成本 乔拓云平台模板式搭建电商平台 方法简单实用 适合电脑零基础的朋友自己搭建 通过
  • rv1126如何切换720p和1080p

    切换720p和1080p可以使用modetest 但是需要将这两种模式都添加到connector中去 添加一个新的mode到connector中去 其实内核中已经有相关接口了 需要做一些小改动 1 不采用设备树的方式去配置 将720p和10
  • 聚水潭无需API开发连接伙伴云,实现新增订单信息自动同步到表单汇总

    聚水潭用户使用场景 电商行业通常使用聚水潭作为企业的ERP系统 然而 每当聚水潭产生新订单时 企业人员常常需要将订单信息手动复制并录入到伙伴云存储 汇总 包括订单单号 状态 金额等20多项信息 这种人工手动复制和录入的方式容易导致订单数据出
  • C++知识框架梳理

    封装 继承 多态被称为面向对象的三大法宝 一 封装 1 类 a 如何创建自己的类 形式如下 class student 类名 student string name 类里面两个内容 年龄名字 叫做类的成员数据 也叫作属性 int age 早
  • Android码农是如何进入腾讯的,Flutter全方位深入探索

    正式加入字节跳动 分享一点面试小经验 今天正式入职了字节跳动 工号超吉利 尾数是3个6 然后办公环境也很好 这边一栋楼都是办公区域 公司内部配备各种小零食 饮料 还有免费的咖啡 15楼还有健身房 而且公司包三餐来着 下午三点半左右还会有阿姨
  • STM32关于定时器输出多路PWM波的持续跟进

    简介 这里简单用stm32产生多路PWM 1 32的通用定时器3可以产生4路PWM输出 同频率 不同占空比 2 一个定时器产生的PWM频率由定时器输入频率决定 时钟树决定通用定时器时钟来自APB1 且如果APB1的分频为1的话 定时器时钟为
  • 抽象类 接口

    1 抽象类 public abstract class AbstractClass 里面至少有一个抽象方法 public int t 普通数据成员 public abstract void method1 抽象方法 抽象类的子类在类中必须实
  • 功率时延谱(PDP)与三种选择性衰落

    衰落与弥散是无线信道的基本特性 电磁波经过无线信道传输后会使原本的信号在时域 频域 空域 角度 上产生弥散现象 导致波形在时间 频谱 空间上产生交叠 引起信号的失真 多径效应在时域上引起信号时延扩展 在频域上定义了相关带宽指标 当信号带宽大
  • k8s调度 原理_深入剖析k8s之默认调度器调度策略解析

    本篇专注在调度过程中 Predicates 和 Priorities 这两个调度策略主要发生作用的阶段 Predicates 首先 我们一起看看 Predicates Predicates 在调度过程中的作用 可以理解为 Filter 即

随机推荐

  • 如何使用nfsiostat来分析nfs存储性能问题

    nfsiostat介绍 Sysstat家族包括一个名叫nfsiostat的实用程序 它和iostat有诸多类似之处 它允许你监控NFS文件系统上的读写情况 其用法也和iostat类似 最基本的命令用法是跟上几个参数和两个数字 这两个数字分别
  • vue父子组件传值,父组件内容更新子组件内容不实时更新

    背景 vue父子组件传值不能实时更新问题 父组件将值传给了子组件 但子组件显示的值还是原来的初始值 并没有实时更新 总结了以下三种情况及解决方案 1 子组件没有正确监听父组件传递的值 在子组件中 确保正确地声明了props 并且监听了父组件
  • CVPR2023论文汇总

    点击下方卡片 关注 自动驾驶之心 公众号 ADAS巨卷干货 即可获取 点击进入 自动驾驶之心 全栈算法 技术交流群 CVPR2023中稿paper已经陆续放出来了 自动驾驶之心团队为大家整理了计算机视觉 BEV 分割 Occpuancy v
  • Vue的插槽与作用域插槽详解

    在Vue中 插槽 Slot 是一个非常强大且灵活的特性 用于在父组件中定义子组件的内容 Vue提供了两种主要类型的插槽 默认插槽 Slot 和作用域插槽 Scoped Slot 本篇博文将深入介绍这两种插槽类型 从基础到进阶 默认插槽 Sl
  • 打开一个php网页出现2个ip,php根据ip地址查地区

    自己以前做过一个程序 根据discuz里面的ip查询改的 ip地址所属地区计算 修改自 discuz 使用dicuz tinyipdata数据文件 将一些英文提示修改为汉字 is simple true的话显示到市 false显示到网通电信
  • maven项目中添加MySql依赖失败(以及maven的安装到maven项目的使用过程)

    maven项目中添加MySql依赖失败 以及maven的安装到maven项目的使用过程 1 maven项目中添加MySql依赖失败 报错信息 Dependency mysql mysql connector java not found 解
  • Cadence Allegro PCB设计88问解析(三十) 之 Allegro中 PCB的3D模型导出

    一个学习信号完整性仿真的layout工程师 在进行PCB投板之前 往往需要将PCB的结构发给结构的同事确认 一般会导出DXF和EMN文件 或者导出3D模型 3D模型包含版型 器件的实际3D模型等等 可以比较直观的看到PCB板上的器件情况 下
  • 【git 错误】git 使用中的问题汇总 不定期更新 git报错 Please enter a commit message to explain

    1 Please enter a commit message to explain why this merge is necessary 解决办法 1 按键盘字母 i 进入insert模式 2 修改最上面那行黄色合并信息 可以不修改 3
  • ImportError: /usr/lib/x86_64-linux-gnu/libstdc++.so.6: version `GLIBCXX_3.4.26‘ not foun Python GDAL

    前言 更新完pytorch1 9 0之后 突然GDAL包不能用了 但是代码调试的时候是正常的 本文给出具体的解决过程 提示一下 其实这种因为软件更新导致某个动态库不能通用的情况 一般的解决方法 就是在本机上查找一下有没有别的地方有 这样的解
  • ADAS先进驾驶辅助系统(Advanced Driver Assistant System)

    先进驾驶辅助系统 Advanced Driver AssistantSystem 简称ADAS 是利用安装于车上的各式各样的传感器 可侦测光 热 压力等变数 在第一时间收集车内外的环境数据 进行静 动态物体的辨识 侦测与追踪等技术上的处理
  • YOLOv7——目标检测数据集划分篇

    法一 1 准备VOC数据集 将所有数据集图片放入JPEGImages文件夹中 所有的图片对应的xml文件放入Annotations中 ImageSets文件夹中创建Main文件夹 暂时Main文件夹为空 文件夹结构 datasets Ann
  • 数据标准详细概述-2022

    1 数据标准的是什么 在实际的工作生产中 我们一般会参照国家标准 地方标准 行业标准等来进行具体的活动 来确保我们生成过程符合监管要求 便于上下游协同等 于是我们会见到如下的标准指导文件 同样 数据标准也会以文件的形式存在 在除了国标 行标
  • qq人脸更换_QQ安全中心现在怎么替换人脸设置或删除人脸?

    以下内容收集自网络 题主可以参考一下 1 我们从手机中打开QQ安全中心 如果还不是最新版本的话 请先升级到最新版本 2 在QQ安全中心首页 点击最下方的 工具 按钮 3 在 工具 页面 点击打开 实验室 这个图标 4 在打开的界面 点击打开
  • 四阶魔方玩法总结V1.0

    四阶魔方玩法总结V1 0 1 引言 今写此文 我主要是为了方便自己再次玩其魔方的时候 可以快速的想起 避免又从头学起 毕竟自己学会的 理解的 写出来的东西 再次玩魔方的时候 仅仅是回顾和追忆的过程 不存在学习 理解和消化的过程 避免再次浪费
  • 12.大数据之Hive性能优化

    hive性能调优 1 HADOOP计算框架特性 数据量大不是问题 数据倾斜是个问题 jobs数比较多的作业运行效率相对比较低 比如即使有几百行的表 如果多次关联多次汇总 产生十几个jobs 耗时很长 原因是map reduce作业初始化的时
  • 二叉树类型的常考选择题知识储备(二叉树的性质)

    1 若规定 根节点的层数为 1 则 一个非空二叉树的 第 i 层 上最多有 2i 1 i gt 0 个结点 2 若规定只有根节点的二叉树的深度为1 则 深度为 K 的二叉树的 最大结点数是 2k 1 k gt 0 3 对于任意一个二叉树 如
  • Angular管道操作符(

    一 模板表达式操作符 模板表达式语言使用了JavaScript 语法的子集 并补充了几个用于特定场景的特殊操作符 管道操作符 安全导航操作符 二 管道操作符 在绑定之前 表达式的结果可能需要一些转换 例如 可能希望吧数字显示成金额 强制文本
  • 【Web3】Mnemonic Word Create Wallet

    目录 Create Mnemonic Word 介绍 一 根据 Mnemonic Word 生成密钥对 keypair 二 通过 keypair 获取 Wallet 地址 和 private key 代码 Create Mnemonic W
  • bash: ./make.sh: /bin/sh^M: 解释器错误: 没有那个文件或目录

    原因 在Linux运行 sh文件时报上述错误 原因是因为该文件在windows系统上打开过 关闭后其中的空格符号和Linux的不同 导致这个报错 可以通过sed命令与正则的配合将文件中的空格符号替换成linux的空格 解决方法 sed i
  • 实验6

    一 MPEG 1 Audio LayerII编码器原理 1 多相滤波器组 将PCM样本变换到32个子带的频域信号 如果输入的采样频率为48kHz 那么子带的频率宽度为48 2 32 0 75Hz 缺点 1 等带宽的滤波器组与人类听觉系统的临