首页 > 其他分享 >SciTech-AV-Audio-Coding-PCM(Pulse Code Modulation)-脉码编码调制: 无压缩-无损编码

SciTech-AV-Audio-Coding-PCM(Pulse Code Modulation)-脉码编码调制: 无压缩-无损编码

时间:2024-10-16 22:46:24浏览次数:1  
标签:采样 编码 采样率 Code 字节 存储 Modulation unsigned PCM

SciTech-AV-Audio-DAP(Digital Audio Processing)-Loudness Normalization(响度规范化): Perceived Loudness + RMS (Root Mean Square)

PCM(Pulse Code Modulation)也被称为脉码编码调制,
PCM的声音数据没有被压缩
它是由模拟信号经过Sampling、Quantilization、Code 转换成的标准的数字音频数据
采样转换方式参考下图:


音频采样包含以下几大要素:

  1. 采样率
    采样率表示音频信号每秒的数字快照数。该速率决定了音频文件的频率范围。
    采样率越高,数字波形的形状越接近原始模拟波形。
    低采样率会限制可录制的频率范围,这可导致录音表现原始声音的效果不佳。

    • 根据奈奎斯特采样定理,为重现给定频率,采样率必须至少是该频率的两倍。
      例如,一般CD唱片的采样率为每秒 44,100 个采样,因此可重现最高为 22,050 Hz 的频率,
      此频率刚好超过人类的听力极限 20,000 Hz。
    • Over-sampling超采样: 参考
    • 采样图示:

      A是低采样率的音频信号,其效果已经将原始声波扭曲,
      B是完全重现原始声波的,高采样率的音频信号。

    • 数字音频常用的采样率如下:
  2. 位深度
    位深度决定动态范围。位深度越高,提供的动态范围越大。
    采样声波时,为每个采样指定最接近原始声波振幅的振幅值。
    较高的位深度可提供更多可能的振幅值,产生更大的动态范围、更低的噪声基准和更高的保真度。

二、PCM

上面名词解析,我们对PCM有一定的理解和认识,下面做更多的讲解。

  1. PCM音频数据存储方式
    • 如果是单声道的文件,采样数据时间顺序先后存入。
      如果是单声道的音频文件,采样数据时间顺序先后存入(也可用 LRLRLR 方式, 但另一个声道的数据为 0)。
    • 如果是双声道,通常按照 LRLRLR 的方式存储。
    • 存储时还和机器的大小端有关,PCM的存储方式为小端模式。
      关于字节序大小端,可参考《字节序问题之大小端模式讲解》进行了解。
    • 存储Data数据排列如下图所示:
  2. PCM 音频数据的参数
    描述 PCM 音频数据的参数的时候有如下描述方式:
    44100HZ 16bit stereo: 每秒钟有 44100 次采样, 采样数据用 16 位(2 字节)记录, 双声道(立体声)
    22050HZ 8bit  mono: 每秒钟有 22050 次采样, 采样数据用 8 位(1 字节)记录, 单声道
    48000HZ 32bit 51ch: 每秒钟有 48000 次采样, 采样数据用 32 位(4 字节浮点型)记录, 5.1 声道。
    
    44100Hz 指的是采样率,它的意思是每秒取样 44100 次。采样率越大,存储数字音频所占的空间就越大。
    16bit 指的是采样精度,意思是原始模拟信号被采样后,每一个采样点在计算机中用 16 位(两个字节)来表示。采样精度越高越能精细地表示模拟信号的差异。
    Stereo 指的是声道数,也即采样时用到的麦克风的数量,麦克风越多就越能还原真实的采样环境(当然麦克风的放置位置也是有规定的)。
    

三、WAV

  1. WAV 是 Microsoft 和 IBM 为 PC 开发的一种声音文件格式,
    它符合 RIFF(Resource Interchange File Format)文件规范,
    用于保存 Windows 平台的音频信息资源,被 Windows 平台及其应用程序所广泛支持。
  2. WAVE 文件通常只是有单个"WAVE"块的 RIFF 文件, 该块由两子数据块("fmt"块和"data"块)组成,
    它的格式如下图所示:


WAV 格式定义

该格式的实质就是在 PCM 文件的前面加了一个文件头,每个字段的的含义如下:

typedef struct {
    char          ChunkID[4]; //内容为"RIFF"
    unsigned long ChunkSize;  //存储文件的字节数(不包含ChunkID和ChunkSize这8个字节)
    char          Format[4];  //内容为"WAVE“
} WAVE_HEADER;
 
typedef struct {
   char           Subchunk1ID[4]; //内容为"fmt"
   unsigned long  Subchunk1Size;  //存储该子块的字节数(不含前面的Subchunk1ID和Subchunk1Size这8个字节)
   unsigned short AudioFormat;    //存储音频文件的编码格式,例如若为PCM则其存储值为1。
   unsigned short NumChannels;    //声道数,单声道(Mono)值为1,双声道(Stereo)值为2,等等
   unsigned long  SampleRate;     //采样率,如8k,44.1k等
   unsigned long  ByteRate;       //每秒存储的bit数,其值 = SampleRate * NumChannels * BitsPerSample / 8
   unsigned short BlockAlign;     //块对齐大小,其值 = NumChannels * BitsPerSample / 8
   unsigned short BitsPerSample;  //每个采样点的bit数,一般为8,16,32等。
} WAVE_FMT;
 
typedef struct {
   char          Subchunk2ID[4]; //内容为“data”
   unsigned long Subchunk2Size;  //接下来的正式的数据部分的字节数,其值 = NumSamples * NumChannels * BitsPerSample / 8
} WAVE_DATA;

标签:采样,编码,采样率,Code,字节,存储,Modulation,unsigned,PCM
From: https://www.cnblogs.com/abaelhe/p/18471085

相关文章

  • 浏览器安装 AtCoder Better 和 Codeforces Better 插件
    你首先需要篡改猴。如果你用的Google浏览器,请用这个Link,不过你可能需要挂个梯子。如果你用的Firefox浏览器,请用这个Link,这个不需要梯子。如果你用的edge浏览器,请用这个Link,这个也不需要梯子。下载好篡改猴之后,无论什么浏览器,点击这个链接,安装AtCoderBetter插件;点......
  • CodeForces - 1364D
    通常的想法是:如果图是一棵树,那么通过对顶点进行双色染色,并从更频繁的颜色中选取顶点,就可以轻松找到大小为\(\lceil\frac{n}{2}\rceil\)的独立集合。否则,图就是循环的。让我们得到一个没有任何边“穿过”的循环。换句话说,它没有任何一对不相邻的顶点由边连接。如果它的长度最多......
  • IDEA如何进行阿里巴巴编码规约扫描并导出报告
    前言我们在使用IDEA开发Java应用时,可以安装很多的插件来帮助我们高效的开发代码。我们需要注意开发的编码规范,这时候就可以安装一款很有名的插件,阿里巴巴的编码规约插件。可以用这个插件,对我们的代码进行扫描,并且导出报告,那么我们应该怎么操作呢?如何扫描代码并且导出报告首先,......
  • AtCoder ABCD做题计划
    vjudge链接AtCoderBeginnerContest360ABCDAtCoderBeginnerContest359ABCDAtCoderBeginnerContest358ABCDAtCoderBeginnerContest357ABCDAtCoderBeginnerContest356ABCDAtCoderBeginnerContest355ABCDAtCoderBegi......
  • leetcode算法题 437.路径总和
    题目描述给定一个二叉树的根节点 root ,和一个整数 targetSum ,求该二叉树里节点值之和等于 targetSum 的 路径 的数目。路径 不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点)。 示例示例1:输入:root=[10,5,-3,3,2,null,1......
  • Gstreamer系列(5):Gstreamer在arm平台(Nano, Orin, Xavier等)使用硬编码对视频进行保存mp
            在工程实践中,通常使用使用英伟达版板卡作为图像处理的控制器,常见的有xavier,TX2,orin,Nano等,这些控制器使用Gstreamer进行硬件编码的插件通常为omxh264enc,nvv4l2h264enc。本文将基于这两个插件进行介绍区别,并给出使用示例本。本系列其他文章有:Gstreamer系......
  • <Leetcode:算法题及解析>最大子数组和(Javascript版)
    题目描述:给你一个整数数组nums,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。子数组是数组中的一个连续部分。本题可以使用Kadane's算法实现,这是一种用于解决最大子数组和问题的高效算法。它由JosephBornKadane在1984年提出。这个算法的核......
  • NSString 与 Unicode
    英文: https://www.objc.io/issues/9-strings/unicode/https://learn.microsoft.com/en-us/dotnet/api/system.string.normalize?view=net-8.0 当你在处理文本时,如果你不是在写一些非常古老的代码(legacycode),那么你一定要使用 Unicode。幸运的是,苹果和NeXT一直致力于推动......
  • Educational Codeforces Round 170 (Rated for Div. 2)
    A.TwoScreens难点是读题,找到最长公共前缀即可。#include<bits/stdc++.h>usingnamespacestd;usingi32=int32_t;usingi64=longlong;#defineinti64usingvi=vector<int>;usingpii=pair<int,int>;consti32inf=INT_MAX/2;constintm......
  • python批处理,一键打开vscode窗口,分别加载jeecg前后端项目,并运行前后端服务.
    importsubprocess#VsCode打开后端项目cmd1=["code","D:\pro\JeecgBoot-v3.7.1\jeecg-boot"]process1=subprocess.Popen(cmd1,stdout=subprocess.PIPE,shell=True)output1,_=process1.communicate()print(output1.decode('utf-8')......