C语言实现16k、48kpcm数据的双向重采样

news2025/1/16 17:54:06

文章目录

  • 注意事项
  • 重采样代码
  • int16_t数据溢出测试
    • 代码
    • 测试结果

注意事项

  1. 音频重采样过程中使用有符号数,确保计算过程正确。
  2. 在48k->16k的下采样过程中,3个采样点数据相加取平均值不用担心溢出问题。已使用测试代码确认在Linux、Windows均正常。

重采样代码

/**
 * @brief Resample audio from 16kHz to 48kHz
 *
 * @param src_data pointer to src data
 * @param len length of src data
 * @param channel channel count of src data
 * @param dst_data pointer to destination data, caller shoud allocate enough
 * buffer to store
 */
static void prv_rtc_resample_16k_to_48k(const uint8_t *src_data, int len,
                                        int channel, uint8_t *dst_data) {
  const int16_t *src_data_index = (const int16_t *)src_data;
  int16_t *dst_data_index = (int16_t *)dst_data;
  const int samples = len / (channel * (sizeof(int16_t) * sizeof(uint8_t)));
  for (int i = 0; i < samples; i++) {
    for (int j = 0; j < channel; j++) {
      dst_data_index[i * 3 * channel + j * 3 + 0] =
          src_data_index[i * channel + j];
      dst_data_index[i * 3 * channel + j * 3 + 1] =
          src_data_index[i * channel + j];
      dst_data_index[i * 3 * channel + j * 3 + 2] =
          src_data_index[i * channel + j];
    }
  }
}

/**
 * @brief Resample audio from 48kHz to 16kHz
 *
 * @param src_data pointer to src data
 * @param len length of src data
 * @param channel channel count of src data
 * @param dst_data pointer to destination data, caller shoud allocate enough
 * buffer to store
 */
static void prv_rtc_resample_48k_to_16k(const uint8_t *src_data, int len,
                                        int channel, uint8_t *dst_data) {
  const int16_t *src_data_index = (const int16_t *)src_data;
  int16_t *dst_data_index = (int16_t *)dst_data;
  const int samples = len / (3 * channel * (sizeof(int16_t) * sizeof(uint8_t)));
  for (int i = 0; i < samples; i++) {
    for (int j = 0; j < channel; j++) {
      dst_data_index[i * channel + j] =
          (src_data_index[i * 3 * channel + j * 3 + 0] +
           src_data_index[i * 3 * channel + j * 3 + 1] +
           src_data_index[i * 3 * channel + j * 3 + 2]) /
          3;
    }
  }
}

int16_t数据溢出测试

代码

#include <stdio.h>
#include <stdint.h>

int main() {
	int16_t tmp1 = 0x7fff, tmp2 = 0x7fff, tmp3 = 0x7fff;
	int16_t sum1 = tmp1 + tmp2 + tmp3;
	int32_t sum2 = tmp1 + tmp2 + tmp3;

	printf("sum1: %d, sum1/3: %d, %d\n", sum1, sum1 / 3, ((tmp1 + tmp2 + tmp3) / 3));
	printf("sum1: %d, sum1/3: %d\n", sum2, sum2 / 3);

	return 0;
}

测试结果

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/885117.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

生活随笔,记录我的日常点点滴滴.

前言 &#x1f618;个人主页&#xff1a;曲终酣兴晚^R的小书屋&#x1f971; &#x1f615;作者介绍&#xff1a;一个莽莽撞撞的&#x1f43b; &#x1f496;专栏介绍&#xff1a;日常生活&往事回忆 &#x1f636;‍&#x1f32b;️每日金句&#xff1a;被人暖一下就高热&…

Nuxt3_1_路由+页面+组件+资源+样式 使用及实例

1、 简介 1.1 开发必备 node版本 v16.10.0 我使用的是16.14.0编辑器推荐使用Volar Extension 的VS code插件Terminal 运行nuxt指令 1.2 环境搭建 安装项目&#xff1a; npx nuxilatest init [first_nuxt3]进入项目目录&#xff1a; cd [first_nuxt3]安装依赖&#xff1a;n…

day06-点赞系统

当热心用户或者老师给学生回答了问题以后&#xff0c;所有学员可以给自己心仪的回答点赞&#xff0c;点赞越高&#xff0c;排名也越靠前。 1.1.业务需求 首先我们来分析整理一下点赞业务的需求&#xff0c;一个通用点赞系统需要满足下列特性&#xff1a; 1.2.实现思路 要保…

服务器数据恢复-HP EVA存储常见故障的数据恢复流程

EVA存储原理&#xff1a; EVA系列存储是以虚拟化存储为实现目的的中高端存储设备&#xff0c;内部的结构组成完全不同于其他的存储设备&#xff0c;RAID在EVA内部称之为VRAID。 EVA会在每个物理磁盘&#xff08;PV&#xff09;的0扇区写入签名&#xff0c;签名后PV会被分配到不…

项目实施方案案例模板-拿来即用

《项目实施方案》实际案例模板&#xff0c;拿来即用&#xff0c;原件可获取。 项目背景 项目目标 项目范围 项目总体计划 项目组织架构 5.1. 项目职责分工 项目风险点 6.1. 项目风险分析 6.2. 项目实施关键点 项目管理规范 7.1. 项目实施约束 7.2. 项目变更冻结 7…

Vue3组件应用及单文件组件 - 抽象独立的代码

目录 前言01-组件的概念及组件的基本使用方式02-组件之间是如何进行互相通信的03-组件的属性与事件是如何进行处理的04-组件的内容是如何组合与分发处理的05-单文件组件SFC06-Vue CLI脚手架安装 前言 学习前的准备工作 官网地址&#xff1a;https://cn.vuejs.org/ Vue.js文件下…

【校招VIP】前端vue考点之生命周期和双向绑定

考点介绍&#xff1a; VUE是前端校招面试的重点&#xff0c;而生命周期和双向绑定又是基础考点之一&#xff0c;尤其在一二线公司&#xff0c;要求知道双向绑定的原理&#xff0c;以及相关代码实现。 『前端vue考点之生命周期和双向绑定』相关题目及解析内容可点击文章末尾链接…

骨传导耳机骑车好吗,骨传导耳机可用于骑摩托车吗?

如今&#xff0c;越来越多的人在选择耳机时转向了骨传导耳机&#xff0c;相较于传统耳机&#xff0c;这种神奇的创新产品能够让我们享受音乐的同时&#xff0c;也无需将耳机塞入耳中。无论是运动还是日常使用&#xff0c;这种设计都能给我们带来极佳的防丢能力。再也不用担心在…

【DDD - 概念】领域模型

什么是模型&#xff1a; 模型是一种知识形式&#xff0c;它通过对知识进行抽象和选择性简化和有意识的结构化来传达重要的要素信息&#xff0c;它可以使人专注于问题并帮助人快速的理解问题。因为系统需要一整套的知识体系来完成特定的功能&#xff0c;这一整套的知识体系是很…

误删文件恢复软件,这2款小白也能轻松使用!

“快给我推几个好用的文件恢复软件吧&#xff01;真的非常需要&#xff01;突然不见了好多重要的文件&#xff0c;让我超级崩溃&#xff01;怎么找回这些文件呢&#xff1f;” 电脑误删文件已经是一个电脑用户比较常见的问题了&#xff0c;可能很多人都经历过这种崩溃的瞬间。那…

【C# 基础精讲】自定义异常类

自定义异常类是C#中异常处理的一种重要方式&#xff0c;它允许您创建具有自定义错误信息和处理逻辑的异常类型&#xff0c;以提高程序的可读性和可维护性。通过自定义异常类&#xff0c;您可以为特定的业务逻辑或应用场景创建更有意义的异常&#xff0c;使错误处理更加精确和有…

凸优化基础学习——凸集

凸优化基础学习——凸集 文章内容全部来自对Stephen Boyd and Lieven vandenberghe的Convex Optimization的总结归纳。 电子书资源&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1dP5zI6h3BEyGRzSaJHSodg?pwd0000 提取码&#xff1a;0000 基本概念 仿射集合 **…

JVM中判定对象是否回收的的方法

引用计数法 引用计数法是一种垃圾回收&#xff08;Garbage Collection&#xff09;算法&#xff0c;用于自动管理内存中的对象。在引用计数法中&#xff0c;每个对象都有一个关联的引用计数器&#xff0c;用于记录对该对象的引用数量。 当一个新的引用指向对象时&#xff0c;…

【数据分享】2023年7月全国各城市公交线路与站点数据

公交线路与站点数据是我们做城市研究时经常会用到的基础数据。那么去哪里获取该数据呢&#xff1f;今天&#xff0c;我们就给大家分享一份2023年7月采集的全国所有城市的公交站点与线路数据&#xff0c;数据格式为shp矢量格式。数据来源于开源公交信息查询网站。 数据预览 我…

Netty:ChannelHandler抛出异常,对应的channel被关闭

说明 使用Netty框架构建的socket服务端在处理客户端请求时&#xff0c;每接到一个客户端的连接请求&#xff0c;服务端会分配一个channel处理跟该客户端的交互。如果处理该channel数据的ChannelHandler抛出异常没有捕获&#xff0c;那么该channel会关闭。但服务端和其它客户端…

LeetCode Top100 Liked 题单(序号34~51)

​34. Find First and Last Position of Element in Sorted Array ​ 题意&#xff1a;找到非递减序列中目标的开头和结尾 我的思路 用二分法把每一个数字都找到&#xff0c;最后返回首尾两个数 代码 Runtime12 ms Beats 33.23% Memory14 MB Beats 5.16% class Solution {…

如何借助数字化为企业管理赋能?

数字化可以利用技术简化流程、增强决策并提高整体效率&#xff0c;从而显着增强企业管理能力。以下是有关如何使用数字化赋能企业管理的分步指南&#xff1a; 1.评估当前流程和需求&#xff1a; 了解您当前的业务流程、痛点以及可以从数字化中受益的领域。确定您想要解决的具体…

函数递归专题(案例超详解一篇讲通透)

函数递归 前言1.递归案例:案例一&#xff1a;取球问题案例二&#xff1a;求斐波那契额数列案例三&#xff1a;函数实现n的k次方案例四&#xff1a;输入一个非负整数&#xff0c;返回组成它的数字之和案例五&#xff1a;元素逆置案例六&#xff1a;实现strlen案例七&#xff1a;…

Python爱心光波

文章目录 前言Turtle入门简单案例入门函数 爱心光波程序设计程序分析 尾声 前言 七夕要来啦&#xff0c;博主在闲暇之余创作了一个爱心光波&#xff0c;感兴趣的小伙伴们快来看看吧&#xff01; Turtle入门 Turtle 是一个简单而直观的绘图工具&#xff0c;它可以帮助你通过简…

avue 时间选择器限制时间范围(当天以后的时间、当前月、当前月剩余时间)

时间选择器做项目时必不可少的组件&#xff0c; 今天就简单举几个常用的例子供参考。 <avue-form v-model"form" :option"option"></avue-form><script> export default {data() {return {form:{},option:{column: [{label: "禁止日…