音频帧大小
Posted 流樱魔
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了音频帧大小相关的知识,希望对你有一定的参考价值。
本文主要说明如何计算一帧PCM音频帧的内存大小,
区分采样间隔和发送间隔的概念,
我发现很多文章中都没有把这两个概念区分清楚。
采集部分,从音频基本概念将其其中的采样间隔理解为采样率,即每秒采集多少次。这是大多数人所熟知的。
------------------------------------------------采集部分------------------------------------------------
PCM作为音频的原始数据格式,将声音进行量化时有以下几个概念:
采样率,采样大小(位深),声道数。
采样率:比如16kHz表示采集时每秒采集16k次,此时就会有16k个采样点;
采样大小:如16bit表示每个采样点存储在16bit内存中,即需要2个字节在保存;
声道很好理解:比如双声道是为了人耳听左右耳声音不同,比较有立体效果;但从音频数据存储的角度来说就要保存双份的采样音频数据。
PCM音频流的码率:采样率x采样大小x声道数。
如16k x 16 x 2=512kb/s,即每秒的音频原始数据需要占512kbit。
可以理解为音频采样时,按每秒16k次的频率进行采样,16bit即每个采样点存2个字节,每次存2份(声道),这1s的音频数据需要用的512kbit空间来存放,也就是512kbit/8=64k字节。
------------------------------------------------发送部分------------------------------------------------
我们假设不进行编码,直接原始音频数据进行传输,每秒64k字节的数据,采集一秒发送一次,也不是不行,不过实时性不够,量也太大。
所以正常会有个发送间隔的概念,比如20ms发送一次数据,说明每秒钟需发送50次(1s=1000ms);有些文章会将这个间隔时间叫做采样间隔,我感觉会经常和采样率混在一起,不好理解。所以我觉得叫发送间隔会更好。这个与sip中协商的发送媒体打包时长ptime的概念很类似,跟他进行对比理解比较好理解。
这边发送的每次数据就是一帧PCM音频帧,按码率为64k字节来算,一帧PCM音频为:64k/50=1280字节;也就是此时你为每帧PCM需要开辟1280字节内存来存放。
如果是正常16k采样率,16bit采样大小,单声道,即32k字节的每秒的码率的音频数据,以20ms的发送间隔,一帧PCM数据 = 32k / 50 = 640字节。
如果按10ms的发送间隔,此时每帧PCM的大小即为320字节。
比如我在做的AC的DSP芯片的PCM音频包默认就是16k采样率,16bit采样大小,单声道的数据,发送出来的间隔为10ms,我们编码时为其开辟的buffer为320字节。
Python Librosa:用于计算 MFCC 特征的默认帧大小是多少?
【中文标题】Python Librosa:用于计算 MFCC 特征的默认帧大小是多少?【英文标题】:Python Librosa : What is the default frame size used to compute the MFCC features? 【发布时间】:2016-10-24 02:25:22 【问题描述】:使用 Librosa 库,我将音频文件 1319 秒的 MFCC 特征生成为矩阵20 X 56829
。这里的20
代表MFCC 功能的数量(我可以手动调整)。但我不知道它是如何将音频长度分割成56829
。处理音频所需的帧大小是多少?
import numpy as np
import matplotlib.pyplot as plt
import librosa
def getPathToGroundtruth(episode):
"""Return path to groundtruth file for episode"""
pathToGroundtruth = "../../../season01/Audio/" \
+ "Season01.Episode%02d.en.wav" % episode
return pathToGroundtruth
def getduration(episode):
pathToAudioFile = getPathToGroundtruth(episode)
y, sr = librosa.load(pathToAudioFile)
duration = librosa.get_duration(y=y, sr=sr)
return duration
def getMFCC(episode):
filename = getPathToGroundtruth(episode)
y, sr = librosa.load(filename) # Y gives
data = librosa.feature.mfcc(y=y, sr=sr)
return data
data = getMFCC(1)
【问题讨论】:
您能提供您使用的代码吗? 用代码更新了问题 【参考方案1】:简答
您可以通过更改 stft 计算中使用的参数来指定更改长度。以下代码将使您的输出大小加倍(20 x 113658)
data = librosa.feature.mfcc(y=y, sr=sr, n_fft=1012, hop_length=256, n_mfcc=20)
长答案
Librosa 的 librosa.feature.mfcc()
函数实际上只是作为 librosa 的 librosa.feature.melspectrogram()
函数的包装器(它是 librosa.core.stft
和 librosa.filters.mel
函数的包装器)。
与音频信号分割有关的所有参数(即帧和重叠值)都在 Mel 缩放功率谱图函数中指定使用(以及为嵌套核心函数指定的其他可调参数)。您可以在 librosa.feature.mfcc()
函数中将这些参数指定为关键字参数。
所有额外的**kwargs
参数都被馈送到librosa.feature.melspectrogram()
,随后被馈送到librosa.filters.mel()
默认情况下,Mel-scaled 功率谱图窗口和跳长如下:
n_fft=2048
hop_length=512
所以假设你使用默认采样率 (sr=22050
),你的 mfcc 函数的输出是有意义的:
输出长度 = (秒) * (采样率) / (hop_length)
(1319) * (22050) / (512) = 56804 个样本
您可以调整的参数如下:
Melspectrogram Parameters
-------------------------
y : np.ndarray [shape=(n,)] or None
audio time-series
sr : number > 0 [scalar]
sampling rate of `y`
S : np.ndarray [shape=(d, t)]
power spectrogram
n_fft : int > 0 [scalar]
length of the FFT window
hop_length : int > 0 [scalar]
number of samples between successive frames.
See `librosa.core.stft`
kwargs : additional keyword arguments
Mel filter bank parameters.
See `librosa.filters.mel` for details.
如果您想进一步指定用于定义 Mel-scaled 功率谱图的 mel 滤波器组的特性,您可以调整以下
Mel Frequency Parameters
------------------------
sr : number > 0 [scalar]
sampling rate of the incoming signal
n_fft : int > 0 [scalar]
number of FFT components
n_mels : int > 0 [scalar]
number of Mel bands to generate
fmin : float >= 0 [scalar]
lowest frequency (in Hz)
fmax : float >= 0 [scalar]
highest frequency (in Hz).
If `None`, use `fmax = sr / 2.0`
htk : bool [scalar]
use HTK formula instead of Slaney
Librosa 文档:
librosa.feature.melspectrogram
librosa.filters.mel
librosa.core.stft
【讨论】:
以上是关于音频帧大小的主要内容,如果未能解决你的问题,请参考以下文章