视音频数据的数据源分析---音频

视音频数据的数据源分析 

与视频数据一样,音频数据在传输之前也要经过压缩来降低码率。一般来说原始音频信流是 PCM 编码的,而研究发现,直接采用 PCM 码流进行存储和传输存在非常大的冗余度。已经证明,在音频无损压缩中,压缩比至少可达 4:1,虽然这远不及视频数据的压缩效率,但是 也能在一定程度上减小源数据的冗余度,节约带宽资源和存储资源。  上面提及了两个处理音频信号的过程,其一是 PCM 编码,另一个是音频数据的压缩。下面 分别介绍这两个处理过程。  
1.PCM编码



上图是 PCM 编码的简要框图,其中: 

 1.防失真滤波器是一个低通滤波器,用于滤出声音频带以外的噪声信号; 

 2.波形编码器即是采样器。 

经过采样、量化、编码后就完成了音频信号的数字化过程。采样就是每隔一段时间间隔读一 次数据,在时间上对原信号离散化。而在量化编码过程中,较之均匀量化,非均匀量化可使 精度不致大幅下降的前提下有效的减少量化比特数。在 PCM 中,存在 u 律 15 折线(北美和 日本等地区采用这种)和 A 律 13 折线(欧洲和中国大陆等地区采用这种)两种压扩方法。   

此外在通信中提高线路利用率的通常还有时分复用和频分复用两种方法。时分复用是指将传 输信道按时间来分割,为每个用户指定一个时间间隔。每个间隔里传输信号的一部分,这样就可以使许多用户同时使用一条传输线路。而频分复用则是指把传输信号的频带分成好几个窄带,每个窄带传送一路信号。


2.音频数据压缩

音频压缩的目的是在保证信号在听觉方面不产生失真的前提下,对原始数据进行尽可能大的 压缩。这就需要最大限度的去除掉原信号中的冗余部分,即那些不能被人耳感知到的信号成 分。这包括了两部分:

a)人耳听觉范围以外的信号;

b)被掩蔽掉的音频信号。 

掩蔽效应是指根据人耳听觉的生理和心理特性,当一个强音信号与一个弱音信号同时存在 时,弱音信号将被强音信号所掩蔽而听不见,这样弱音信号就可以视为冗余信号而不用传送 了。这种掩蔽现象主要表现为频谱掩蔽效应和时域掩蔽效应。

a.频域掩蔽效应:一个较弱的信号被另一个相近频率的较强信号的声音所掩蔽;

b.时域掩蔽效应:一个信号被另一个时间间隔很短的信号所掩蔽,亦称为瞬时掩蔽。 

常见的音频编码标准有 MPEG‐1/2 Layer I,II,III;MPEG‐2 AAC 等等。 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的音频PCM数据相似度分析的C语言源码示例: ```c #include <stdio.h> #include <stdlib.h> #include <math.h> #define SAMPLE_RATE 44100 // 采样率 #define NUM_SAMPLES 44100 // 采样数 #define WINDOW_SIZE 512 // 窗口大小 #define HOP_SIZE 256 // 跳跃大小 typedef struct { float* data; int size; } AudioBuffer; float calculate_rms(AudioBuffer* buffer) { float sum = 0.0f; for (int i = 0; i < buffer->size; i++) { sum += buffer->data[i] * buffer->data[i]; } return sqrtf(sum / buffer->size); } float calculate_similarity(AudioBuffer* buffer1, AudioBuffer* buffer2) { int num_windows = (NUM_SAMPLES - WINDOW_SIZE) / HOP_SIZE + 1; float* window1 = (float*)malloc(sizeof(float) * WINDOW_SIZE); float* window2 = (float*)malloc(sizeof(float) * WINDOW_SIZE); float* buffer1_rms = (float*)malloc(sizeof(float) * num_windows); float* buffer2_rms = (float*)malloc(sizeof(float) * num_windows); for (int i = 0; i < num_windows; i++) { // 提取窗口 for (int j = 0; j < WINDOW_SIZE; j++) { window1[j] = buffer1->data[i * HOP_SIZE + j]; window2[j] = buffer2->data[i * HOP_SIZE + j]; } // 计算两个窗口的RMS buffer1_rms[i] = calculate_rms(&(AudioBuffer){ window1, WINDOW_SIZE }); buffer2_rms[i] = calculate_rms(&(AudioBuffer){ window2, WINDOW_SIZE }); } // 计算相似度 float sum = 0.0f; for (int i = 0; i < num_windows; i++) { sum += buffer1_rms[i] * buffer2_rms[i]; } float similarity = sum / num_windows; free(window1); free(window2); free(buffer1_rms); free(buffer2_rms); return similarity; } int main() { AudioBuffer buffer1 = { .data = (float*)malloc(sizeof(float) * NUM_SAMPLES), .size = NUM_SAMPLES }; AudioBuffer buffer2 = { .data = (float*)malloc(sizeof(float) * NUM_SAMPLES), .size = NUM_SAMPLES }; // 填充音频数据 for (int i = 0; i < NUM_SAMPLES; i++) { buffer1.data[i] = sinf(2.0f * M_PI * 440.0f * i / SAMPLE_RATE); buffer2.data[i] = sinf(2.0f * M_PI * 440.0f * i / SAMPLE_RATE + M_PI / 2.0f); } float similarity = calculate_similarity(&buffer1, &buffer2); printf("Similarity: %f\n", similarity); free(buffer1.data); free(buffer2.data); return 0; } ``` 该示例代码使用RMS(均方根)和窗口技术来计算两个音频PCM数据的相似度。通过将音频数据分成多个窗口,然后计算每个窗口的RMS,最后计算RMS的平均值来计算相似度。这种方法可以减少时间域中的干扰,并更好地捕获频域中的相似度。该示例仅用于演示目的,实际应用中可能需要更复杂的算法来获得更准确的结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值