混合 16 位线性 PCM 流并避免削波/溢出

2024-01-03

我尝试将 2 个 16 位线性 PCM 音频流混合在一起,但似乎无法克服噪音问题。我认为它们是在将样品混合在一起时溢出的。

我有以下功能...

short int mix_sample(short int sample1, short int sample2)
{
    return #mixing_algorithm#;
}

...这是我尝试过的#mixing_algorithm#

sample1/2 + sample2/2
2*(sample1 + sample2) - 2*(sample1*sample2) - 65535
(sample1 + sample2) - sample1*sample2
(sample1 + sample2) - sample1*sample2 - 65535
(sample1 + sample2) - ((sample1*sample2) >> 0x10) // same as divide by 65535

其中一些产生了比其他更好的结果,但即使是最好的结果也包含相当多的噪音。

有什么想法如何解决吗?


我找到的最好的解决方案是由维克托·托特提供 http://www.vttoth.com/CMS/index.php/technical-notes/68。他为 8 位无符号 PCM 提供了一个解决方案,并将其更改为 16 位有符号 PCM,结果如下:

int a = 111; // first sample (-32768..32767)
int b = 222; // second sample
int m; // mixed result will go here

// Make both samples unsigned (0..65535)
a += 32768;
b += 32768;

// Pick the equation
if ((a < 32768) || (b < 32768)) {
    // Viktor's first equation when both sources are "quiet"
    // (i.e. less than middle of the dynamic range)
    m = a * b / 32768;
} else {
    // Viktor's second equation when one or both sources are loud
    m = 2 * (a + b) - (a * b) / 32768 - 65536;
}

// Output is unsigned (0..65536) so convert back to signed (-32768..32767)
if (m == 65536) m = 65535;
m -= 32768;

使用这一算法意味着几乎不需要对输出进行裁剪,因为它只有一个值未在范围内。与直接平均不同,即使一个源静音,另一个源的音量也不会降低。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

混合 16 位线性 PCM 流并避免削波/溢出 的相关文章

  • 为什么pow函数比简单运算慢?

    从我的一个朋友那里 我听说 pow 函数比简单地将底数乘以它的指数的等价函数要慢 例如 据他介绍 include
  • ComboBox DataBinding 导致 ArgumentException

    我的几个类对象 class Person public string Name get set public string Sex get set public int Age get set public override string
  • C++ 是否可以在 MacOS 上与 OpenMP 和 boost 兼容?

    我现在已经尝试了很多事情并得出了一些结论 也许 我监督了一些事情 但似乎我无法完成我想要的事情 问题是 是否有可能使用 OpenMP 和 boost 在 MacOS High Sierra 上编译 C 一些发现 如果我错了请纠正我 Open
  • IdentityServer 4 对它的工作原理感到困惑

    我阅读和观看了很多有关 Identity Server 4 的内容 但我仍然对它有点困惑 因为似乎有很多移动部件 我现在明白这是一个单独的项目 它处理用户身份验证 我仍然不明白的是用户如何注册它 谁存储用户名 密码 我打算进行此设置 Rea
  • 查找进程的完整路径

    我已经编写了 C 控制台应用程序 当我启动应用程序时 不使用cmd 我可以看到它列在任务管理器的进程列表中 现在我需要编写另一个应用程序 在其中我需要查找以前的应用程序是否正在运行 我知道应用程序名称和路径 所以我已将管理对象搜索器查询写入
  • JNI 将 Char* 2D 数组传递给 JAVA 代码

    我想从 C 代码通过 JNI 层传递以下指针数组 char result MAXTEST MAXRESPONSE 12 12 8 3 29 70 5 2 42 42 在java代码中我写了以下声明 public static native
  • 为什么在 WebApi 上下文中在 using 块中使用 HttpClient 是错误的?

    那么 问题是为什么在 using 块中使用 HttpClient 是错误的 但在 WebApi 上下文中呢 我一直在读这篇文章不要阻止异步代码 https blog stephencleary com 2012 07 dont block
  • 当一组凭据下的计划任务启动的进程在另一组凭据下运行另一个程序时,Windows 是否有限制

    所以我有一个简单的例子 其中我有应用程序 A 它对用户 X 本地管理员 有一些硬编码的凭据 然后它使用硬编码的绝对路径启动带有这些凭据的应用程序 B A 和 B 以及 dotnet 控制台应用程序 但是它们不与控制台交互 只是将信息写入文件
  • unordered_map 中字符串的 C++ 哈希函数

    看起来 C 标准库中没有字符串的哈希函数 这是真的 在任何 c 编译器上使用字符串作为 unordered map 中的键的工作示例是什么 C STL提供模板专业化 http en cppreference com w cpp string
  • C# 存档中的文件列表

    我正在创建一个 FileFinder 类 您可以在其中进行如下搜索 var fileFinder new FileFinder new string C MyFolder1 C MyFolder2 new string
  • 打破 ReadFile() 阻塞 - 命名管道 (Windows API)

    为了简化 这是一种命名管道服务器正在等待命名管道客户端写入管道的情况 使用 WriteFile 阻塞的 Windows API 是 ReadFile 服务器已创建启用阻塞的同步管道 无重叠 I O 客户端已连接 现在服务器正在等待一些数据
  • 如何在 Qt 应用程序中通过终端命令运行分离的应用程序?

    我想使用命令 cd opencv opencv 3 0 0 alpha samples cpp cpp example facedetect lena jpg 在 Qt 应用程序中按钮的 clicked 方法上运行 OpenCV 示例代码
  • 在视口中查找 WPF 控件

    Updated 这可能是一个简单或复杂的问题 但在 wpf 中 我有一个列表框 我用一个填充数据模板从列表中 有没有办法找出特定的数据模板项位于视口中 即我已滚动到其位置并且可以查看 目前我连接到了 listbox ScrollChange
  • 为什么我的单选按钮不起作用?

    我正在 Visual C 2005 中开发 MFC 对话框应用程序 我的单选按钮是 m Small m Medium 和 m Large 它们都没有在我的 m Summary 编辑框中显示应有的内容 可能出什么问题了 这是我的代码 Pizz
  • 在mysql连接字符串中添加应用程序名称/程序名称[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我正在寻找一种解决方案 在连接字符串中添加应用程序名称或程序名称 以便它在 MySQL Workbench 中的 客户端连接 下可见 SQL
  • 保护 APK 中的字符串

    我正在使用 Xamarin 的 Mono for Android 开发一个 Android 应用程序 我目前正在努力使用 Google Play API 添加应用内购买功能 为此 我需要从我的应用程序内向 Google 发送公共许可证密钥
  • C++ new * char 不为空

    我有一个问题 我在 ASIO 中开发服务器 数据包采用尖头字符 当我创建新字符时 例如char buffer new char 128 我必须手动将其清理为空 By for int i 0 i lt 128 i buffer i 0x00
  • 堆栈是向上增长还是向下增长?

    我在 C 中有这段代码 int q 10 int s 5 int a 3 printf Address of a d n int a printf Address of a 1 d n int a 1 printf Address of a
  • 如何将十六进制字符串转换为无符号长整型?

    我有以下十六进制值 CString str str T FFF000 如何将其转换为unsigned long 您可以使用strtol作用于常规 C 字符串的函数 它使用指定的基数将字符串转换为 long long l strtol str
  • 不区分大小写的字符串比较 C++ [重复]

    这个问题在这里已经有答案了 我知道有一些方法可以进行忽略大小写的比较 其中涉及遍历字符串或一个good one https stackoverflow com questions 11635 case insensitive string

随机推荐

  • VB.NET:如何防止用户在组合框中输入

    如何防止用户在组合框中输入内容 以便用户只能选择定义列表中的一项 Set the DropDownStyle组合框的属性为DropDownList 这将只允许选择列表中的项目 并且不允许任何自由格式的用户输入
  • Ipython Notebook:Mac 中的 jupyter_notebook_config.py 在哪里?

    我刚刚开始使用 Mac 所以如果这听起来太天真 请原谅我 我正在尝试安装Interactive Parallel From https github com ipython ipyparallel https github com ipyt
  • VueJS 中只有在调度和提交完成后才触发路由

    我确实有一个表单提交 它需要电子邮件和密码 然后将它们传递到商店中名为的操作中userSignIn 登录 vue onSubmit if this refs form validate const user email this email
  • oink 日志命令在 Heroku 上不起作用

    我最近开始使用oink gem https github com noahd1 oink在我的 Heroku 应用程序上 因为我注意到一些控制器操作出现了小内存泄漏 oink log 命令在本地工作正常 但我无法弄清楚让它在我的生产站点上工
  • 如何将图像添加到 DataGridView 中的单个特定单元格?

    使用 C 和 Visual Studio 我有一个DataGridView有 2 列 对于每一行 第一列将显示文本 对于除特定行之外的每一行 第二列将显示文本 在第二列的一个特定单元格中 我需要显示一张图像 例如 Row 0 Cell 0
  • GoogleSheets google.script.run 总是去 FailureHandler

    我正在使用 GoogleSheets HTMLService 我正在从我的 Html 页面的脚本中调用 google script run 但它总是会去 FailureHandler 这其中有什么问题吗 请参阅下面的代码 当我运行它时 它总
  • 调整 Java 7 中默认文件系统的行为

    Java 7 引入了一个用于编写自定义文件系统的出色 API 考虑一个用例 我不想实现新的文件系统 我只想调整现有文件系统的行为 例如 翻转从中写入 读取的每一位 在我看来 当前的jdk并没有为此提供适当的设施 AbstractFileSy
  • 想要了解 Haskell 中的递归吗?

    我现在已经使用了许多递归函数 但仍然无法理解这样的函数到底是如何工作的 我熟悉第二行 即 n 0 1 但我不太熟悉最后一行 即 n gt 0 fac n 1 n fac Int gt Int fac n n 0 1 n gt 0 fac n
  • 如何连接蓝牙 a2dp 设备?

    我正在尝试将运行 android 4 1 的 Android 设备与支持 a2dp 的音频接收器配对 我可以在蓝牙设置屏幕上毫无问题地做到这一点 但我很难在代码中做到这一点 基本上我能够发现该设备 但无法通过套接字连接到它 也许我使用了错误
  • 将 cookie 从第一个响应复制到下一个请求

    我使用 HttpRequest gt send 发送第一个 HTTP 请求 并收到带有以下 Set Cookie 标头的 302 响应 设置 Cookie SESSION SCOPE 1 路径 设置 Cookie III EXPT FILE
  • 同一 WAR 中的多个 JAX-RS 应用程序

    I have ApplicationPath resourcesP public class RestfulPrediction extends Application Override public Set
  • Postgresql regexp_matches 语法未按预期工作

    我使用 Postgres正则表达式 匹配提取数字的函数 我使用的正则表达式是 4 s 0 3 s 12 1 s d 4 如果我使用像这样的工具https regexr com https regexr com 验证它是否正常工作 我应用了以
  • NHibernate:映射列表字典

    我的班级有一个类型字段Dictionary
  • Jetty嵌入和JSP编译到1.7?

    我可以以某种方式指定jsp编译的vm的目标版本吗 我需要 1 7 而不是默认的 1 5 我有一个Web应用程序上下文 代码中的一些过滤器等 webapp 本身就是一场爆炸性的战争 因此没有使用 xml 配置 因为不需要 但似乎 为了做到这一
  • 初始包含块和视口之间的区别

    两者之间有什么区别还是相同 我认为它们指的是同一件事 但在不同的上下文中 但我不确定 所以我在这里问 初始包含块和视口虽然彼此相关 但却是两个不同的概念 视口通常是指浏览器窗口的可视区域 页面在屏幕上呈现在该区域中 初始包含块是页面内的逻辑
  • Python 2.6 聊天循环问题。无法同时接收和发送

    我正在尝试制作一个控制台聊天程序 但我的循环有问题 我无法同时获得输入和接收其他人的输入 如果一端发送了两条或更多消息 则另一端在发送一条消息之前无法接收下一条消息 我对 python 相当陌生 正在寻找正确方向的推动 我考虑过多线程 但这
  • 如何使用非 root 用户创建 postgres 容器?

    我想以非 root 用户身份运行 postgres 容器 默认情况下 该映像具有用户 postgres uid 999 当通过命令访问容器时docker exec it mycontainer bin bash 用户是root 为了使容器更
  • 如何在使用 node_save($node) 创建节点时将图像附加到节点;

    您好 我正在使用 drupal 7 并尝试通过使用 php 解析 xml 来导入数据 然后使用以下命令创建节点node save node 到目前为止 我已经成功地从 xml 创建节点 无需任何图像 我想在导入图像时将图像附加到节点 我知道
  • 将值从页面传递到用户控件

    我将姓名和姓氏存储在主页的两个标签中 我在一个类中也有这些值 类没有做太多事情 但我将它们用于将来的扩展 我有一个用户控件 它将发送一封以姓名和姓氏作为正文的电子邮件 我的问题是如何将标签或类变量值传输到用户控件的主体变量中 使用要传递给它
  • 混合 16 位线性 PCM 流并避免削波/溢出

    我尝试将 2 个 16 位线性 PCM 音频流混合在一起 但似乎无法克服噪音问题 我认为它们是在将样品混合在一起时溢出的 我有以下功能 short int mix sample short int sample1 short int sam