将音频样本从 Float32 移位到 SInt16 会导致严重削波

2024-03-06

我对 iOS 及其 C 基础很陌生,但对一般编程并不熟悉。我的困境是这样的。我正在基于复杂 AudioUnits 的应用程序中实现回声效果。该应用程序需要混响、回声和压缩等。但是,只有当我使用特定的时,回声才能正常工作音频流基本描述我的应用程序中生成的音频样本的格式。然而,这种格式不适用于其他音频单元。 虽然还有其他方法可以解决此问题,但修复回声算法中的位旋转可能是最直接的方法。

The*音频流基本描述* 与 echo 一起使用有一个mFormatFlag of: kAudioFormatFlagsAudioUnitCanonical;其具体情况是:

AudioUnit Stream Format (ECHO works, NO AUDIO UNITS)
Sample Rate:              44100
Format ID:                 lpcm
Format Flags:              3116 = kAudioFormatFlagsAudioUnitCanonical
Bytes per Packet:             4
Frames per Packet:            1
Bytes per Frame:              4
Channels per Frame:           2
Bits per Channel:            32
Set ASBD on input
Set ASBD on  output
au SampleRate rate: 0.000000, 2 channels, 12 formatflags, 1819304813 mFormatID, 16 bits per channel

与 AudioUnits 一起使用的流格式是相同的,除了mFormatFlag: kAudioFormatFlagIsFloat | kAudioFormatFlagIsFloat | kAudioFormatFlagsNativeEndian | kAudioFormatFlagsNativeEndian | kAudioFormatFlagIsPacked | kAudioFormatFlagIsPacked | kAudioFormatFlagIsPacked kAudioFormatFlagIsNonInterleaved——其具体内容是:

AudioUnit Stream Format (NO ECHO, AUDIO UNITS WORK)
Sample Rate:              44100
Format ID:                 lpcm
Format Flags:                41 
Bytes per Packet:             4
Frames per Packet:            1
Bytes per Frame:              4
Channels per Frame:           2
Bits per Channel:            32
Set ASBD on input
Set ASBD on  output
au SampleRate rate: 44100.000000, 2 channels, 41 formatflags, 1819304813 mFormatID, 32 bits per channel

为了创建回声效果,我使用两个函数将样本数据移位到SInt16空间,然后返回。正如我所说,这适用于kAudioFormatFlagsAudioUnitCanonical,格式但不是其他格式。当它失败时,声音会被削波和扭曲,但它们仍然存在。我认为这表明这两种格式之间的区别在于数据的排列方式Float32.

// convert sample vector from fixed point 8.24 to SInt16
void fixedPointToSInt16( SInt32 * source, SInt16 * target, int length ) {
    int i;
    for(i = 0;i < length; i++ ) {
        target[i] =  (SInt16) (source[i] >> 9);
        //target[i] *= 0.003;

    }
}

*如您所见,我尝试修改样本的幅度以消除削波 - 显然这不起作用。

// convert sample vector from SInt16 to fixed point 8.24 
void SInt16ToFixedPoint( SInt16 * source, SInt32 * target, int length ) {
    int i;
    for(i = 0;i < length; i++ ) {
        target[i] =  (SInt32) (source[i] << 9);
        if(source[i] < 0) { 
            target[i] |= 0xFF000000;
        }
        else {
            target[i] &= 0x00FFFFFF;
        }
    }
}

如果我能确定之间的差异kAudioFormatFlagIsFloat | kAudioFormatFlagIsFloat | kAudioFormatFlagsNativeEndian | kAudioFormatFlagsNativeEndian | kAudioFormatFlagIsPacked | kAudioFormatFlagIsPacked | kAudioFormatFlagIsPacked kAudioFormatFlagIsNonInterleaved,那么我可以相应地修改上面的方法。但我不知道如何解决这个问题。 CoreAudio 中的文档很神秘,但从我在那里读到的内容以及从CoreAudioTypes.h文件,两者mFormatFlag(s) 指的是相同的定点 8.24 格式。显然有什么不同,但我不知道是什么。

感谢您阅读这个长问题,并提前感谢您提供的任何见解。


kAudioFormatFlagIsFloat表示缓冲区包含浮点值。如果mBitsPerChannel是 32 那么你正在处理float数据(也称为 Float32),如果它是 64,则您正在处理double data.

kAudioFormatFlagsNativeEndian指的是缓冲区中的数据与处理器的字节序匹配,因此不必担心字节交换。

kAudioFormatFlagIsPacked意味着数据中的每一位都很重要。例如,如果您以 32 位存储 24 位音频数据,则不会设置此标志。

kAudioFormatFlagIsNonInterleaved意味着每个单独的缓冲区由一个数据通道组成。音频数据通常是交错的,样本在 L 和 R 通道之间交替:LRLRLRLR。对于 DSP 应用,通常更容易解交织数据并一次在一个通道上工作。

我认为在您的情况下,错误在于您将浮点数据视为定点。浮点数据通常缩放到区间 [-1, +1)。转换float to SInt16您需要将每个样本乘以最大 16 位值(1u << 15, 32768),然后剪辑到区间 [-32768, 32767]。

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

将音频样本从 Float32 移位到 SInt16 会导致严重削波 的相关文章

  • iOS UITableViewCellAccessoryCheckmark 在每次滚动时可见

    我有一个列表 我将其用作复选框 我已启用或禁用选择行上的复选标记 但是当我滚动列表时 它会在每 10 行之后标记行 void tableView UITableView tableView didSelectRowAtIndexPath N
  • 从 UIImagePickerControllerReferenceURL 加载 UIImage

    我正在使用 UIImagePickerController 来允许用户从图像库中选择图像 然后我想在 sqlite 数据库中启动该文件的位置 以便稍后可以参考它 我一直在谷歌上搜索如何做到这一点 但我的结果相当简短 我知道我可以通过调用委托
  • 如何确定 NSURLSessionTask 请求何时开始?

    I use NSURLSessionTask我正在尝试监视我的一些 HTTP 请求需要多长时间 我可以监视什么委托方法 或其他方法 NSURLSessionTask实际上提出了最初的请求 如果这是一个NSURLConnection里面一个N
  • UIKIT_EXTERN_CLASS 和 UIKIT_EXTERN,这两个常量是什么?

    当我在文档中定义类时 我总是在 interface 之前看到这两件事 UIKIT EXTERN CLASS 和 UIKIT EXTERN 这些常量代表什么以及为什么 Apple 将其放在类之前 另一件事是 有文件 UIKitDefines
  • 在 UITableView 中创建隐藏的 UISegmentedControl

    与 iBooks 应用程序一样 当您下拉表格视图时 会出现搜索栏和分段控件 以允许您在两种类型的视图之间搜索和切换 当您向下拉得足够远时 它会停留在该位置 或者当您将桌面视图拉得足够远时 它会被隐藏 我正在尝试用一个来实现同样的事情UISe
  • stringFromDate 始终为 NIL

    我知道这是一个重复的问题 但是在 stackoverflow 和 google 上搜索了许多类似的问题后 没有一个解决方案对我有用 我正在尝试将从数据库收到的日期转换为字符串格式以在 iPhone 应用程序中显示 我正在按以下方式将日期转换
  • CF 类型的带有 __attribute__((NSObject)) 的强 @property 不会保留

    更新 自 Xcode 4 6 起 此问题已得到修复 现在 这项技术再次按预期发挥作用 但是 在代码中使用之前 请务必阅读 Rob Napier 出色答案顶部的注释 原帖 ARC Xcode 4 3 1 iOS 5 1 我有一个 CF 类型
  • 错误:“消息回复时间太长”向设备手表套件 OS 2 发送消息

    从 Apple Watch 向设备发送消息时出现以下错误 错误域 WCErrorDomain代码 7012 消息回复时间太长 UserInfo NSLocalizedDescription 消息回复时间太长 NSLocalizedFailu
  • iPhone中的异步for循环

    for循环看起来像这样 我在视图中编写的确实加载了 因此加载此页面需要更多时间 for int i 3 i lt dataDict objectForKey rss objectForKey channel objectForKey ite
  • 我如何在 ANSI C 中实现类似于 Objective-C @encode() 编译器指令的东西?

    encode 指令返回一个 const char 它是传入的数据类型的各个元素的编码类型描述符 示例如下 struct test int ti char tc printf s encode struct test returns test
  • UIWebView stringByEvaluatingJavaScriptFromString 在后台

    在 iOS 应用程序中 我正在运行一个相当大的脚本UIWebView using stringByEvaluatingJavaScriptFromString 就 JavaScript 字符串的长度而言较大 调用 JavaScript 后会
  • 检测 iPad Safari 用户的最佳方法

    添加用于检测 iPad Safari 用户的代码的最佳方法是什么 我的意思是我们应该使用 1 CSS 通过链接媒体 2 JS 通过navigator对象 我听说使用用户代理字符串并不是检测 iPad 的最佳方法 因为存在不一致的情况 请建议
  • 如何使用 AutoLayout 使 UIView 向上滑动动画?

    this is what I like to achieve 我想执行向上滑动动画 用户可以向上滑动 UIView2 并且 UIView2 将在屏幕上停止一半 我知道如何通过 UIButton 操作以模态方式呈现 UIViewControl
  • 如何在 iphone 和 ipad 的通用应用程序中调用 [[UIScreen mainScreen] 缩放]

    我正在制作一个可以在 ipad 和 iphone 上运行的通用应用程序 到目前为止一切顺利 但我刚刚将我的 SDK 更新到 ios4 并且想要调用 UIScreen mainScreen scale scale 不在 3 2 sdk 中 并
  • 使用 MKPolyline 在地图上绘制用户路线

    我对 Objective c 还很陌生 在我的应用程序中 我试图将用户采取的路线绘制到地图上 到目前为止 这是我仅获取用户当前位置的内容 import StartCycleViewController h import CrumbPath
  • iOS 中的视频可以进行反卷积吗?

    我想拍摄击球手挥动棒球的镜头 但球棒很模糊 视频为 30 fps 通过研究 我发现反卷积似乎是最小化运动模糊的方法 但我不知道是否或如何在我的 iOS 应用程序后处理中实现它 我希望有人能给我指出正确的方向 比如如何在 iOS 中应用反卷积
  • 从 Xcode 6 安装失败:“存在内部 API 错误”

    我尝试在 ipad ios 7 1 2 上运行一个在我的手机 ios 8 4 1 上运行良好的应用程序 Xcode 提示 存在内部 API 错误 仅此而已 我不确定如何解释日志 怎么了 我该如何解决 ipad日志 Aug 29 17 39
  • 免费实时货币换算汇率 xml feed url [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 提供实时更新 xml 数据源以集成到 iPhone 应用程序中的任何链接 您可以尝试这些 xml 文件 http www ecb int
  • NSDate 休息 5 小时

    我运行以下代码 NSDate now NSDate 日期 NSLog now now 并得到 2011 09 16 16 14 16 434 iSavemore 1229 7907 现在 2011 09 16 21 14 16 0000 如
  • 从另一个选项卡重新加载 UITableView

    我在尝试重新加载时遇到问题UITableView从 XML 源加载的单元格数据 这是场景 应用程序包含选项卡 其中一个选项卡中有一个表格视图 它从 XML 文件获取数据并且工作正常 但问题是当我想要更改提要类别并从另一个选项卡更改 XML

随机推荐

  • 如何为 GitHub 开放软件存储库做出贡献?

    我读了很多教程 试图找出使用 GitHub 本身为 GitHub 存储库做出贡献的工作流程的简单步骤 我是一名 Windows 程序员 所以我发现本地 git CLI 非常尴尬 而且要复杂得多 而不是在 GitHub 上完全远程工作 我将在
  • 在排序表达式中使用聚合函数

    我有一个使用从存储过程返回的数据集的报告 有两个关键列 Name and Value 我将此数据集用于两个 tablixes 第一个只是显示数据的简单 tablix 第二组数据基于Name柱子 我需要根据总和对这些数据进行排序Value c
  • 在 Emacs 中编写“Hello World”?

    我想在 Emacs Lisp 中编写一些 Unix 脚本 但是 似乎没有一种干净的方法来写入 STDOUT 因此我可以将结果重定向到文件或将输出通过管道传输到另一个命令 这print函数在输出字符串周围放置双引号 所以我得到 你好世界 代替
  • Visual Studio 2015 调试器 - 对 SqlCommand 的高性能影响

    从 VS2013 升级到 VS2015 后 我对附加了调试器的 Web 应用程序运行速度如此之慢感到震惊 所以我决定使用 VS2013 和 VS2015 进行比较迷你分析器 http miniprofiler com 分析一个特别慢的页面
  • git 写入和读取访问权限,无需成为服务器用户

    我搜索了一段时间 但找不到合适的解决方案 我的情况 我有一台服务器 上面有一个 git 存储库 只有使用合适的 ssh 密钥才能连接到服务器 是否可以向无法访问服务器的用户授予从此特定存储库写入和读取的权限 是否只能通过在服务器上为用户创建
  • 如何在Python中断言两个列表包含相同的元素? [复制]

    这个问题在这里已经有答案了 在编写测试用例时 我经常需要断言两个列表包含相同的元素 而不考虑它们的顺序 我一直通过将列表转换为集合来做到这一点 有没有更简单的方法来做到这一点 EDIT 正如 MarkDickinson 指出的那样 我可以使
  • 称程序“延迟”的最佳方式是什么?

    有两个过程 A1 和 A2 它们都在其代码中调用函数 B function B boolean begin do other stuff end procedure A1 begin do stuff if b then do stuff
  • 将谷歌地图折线转换为 html 画布线 [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我需要将谷歌地图折线显示到 html 画布中 我如何像这样转换坐标 lat 25 5643498 lng 45 34492432 像这样的画
  • 使用 Kotlin 对 Android 10 上的标记进行聚类

    我发现 Google 的开发网站上大多只有 Java 代码示例 Kotlin 的代码示例也很少 这很烦人 所以我不得不在这里问这个问题 我正在尝试设置 ClusterManager 但我没有任何线索说明它应该如何完成 并且没有可以看到的 K
  • 在 Java 中使用 MessageFormat.format() 格式化消息

    我已将一些消息存储在资源包中 我正在尝试按如下方式格式化这些消息 import java text MessageFormat String text MessageFormat format You re about to delete
  • MPI:MPICH2 在 Windows 局域网中安装和编程

    我正在学习MPI 我遵循的第一个教程是here http curveto blogspot in search label Parallel 我在 Windows 7 上使用 MSVC 2010 成功运行的代码是 include mpi h
  • 浏览器支持以双斜杠开头的 URL

    我最近看到一些没有协议的链接 它看起来并不太难理解 我认为这是一个好主意并且非常直观 对于那些不知道的人 请使用类似的 URL example com script js将指向任一http example com script js or
  • 通过反射使用字符串值设置属性

    我想通过反射设置对象的属性 其值为 typestring 因此 举例来说 假设我有一个Ship类 其属性为Latitude 这是一个double 这是我想做的 Ship ship new Ship string value 5 5 Prop
  • 无法连接到远程虚拟机。连接被拒绝。尝试在 Flash Builder 4.7 中调试远程 java 应用程序时

    在某一时刻 远程调试曾经发挥过作用 但对于我的一生 我似乎无法弄清楚是什么破坏了它 我有一个 Flex Java 应用程序 有一个启动 tomcat 服务器的包装器 我修改了wrapper conf文件以包含 Xdebug Xrunjdwp
  • 当波浪号出现在表达式之前时,它有什么作用?

    var attr input textarea indexOf target tagName toLowerCase value innerHTML 我在一个答案里看到过 以前没见过 这是什么意思 is a 翻转其操作数中的所有位 例如 如
  • “pick”函数的 TypeScript 通用类型(结果对象值类型)

    在编写 pick 函数的类型时遇到问题 当仅选择一个键或具有相同类型值的多个键时 一切正常 但是 如果我尝试选择几个键并且它们的值是不同类型 我会收到错误 不太确定我在哪里犯了错误 感谢您的时间 export interface Mappe
  • 传单地图单击更改颜色,然后再次单击时删除

    我正在使用 Leaflet 制作美国地图 并且具有单击功能来放大和更改州的颜色 这可行 但我不能 单击另一个状态时使颜色返回到之前的颜色 目前 每次我点击一个状态 颜色就会改变 并且不会删除之前的颜色变化 这是我的代码 var map L
  • Python - 使用utf-8编码读取和写入csv文件

    我正在尝试读取一个 csv 文件 其标头包含外来字符 并且我遇到了很多问题 首先 我使用简单的 csv reader 读取文件 filename C Users yuval Desktop new resources mk str mkNu
  • 内联表单,缩小以使标签适合左侧

    标题说标签是因为这是我的用例 但显然它可以是任何元素 我想要实现的是以下表单布局 label input another label input third label input 目前我的 HTML 大致如下 省略细节 div overf
  • 将音频样本从 Float32 移位到 SInt16 会导致严重削波

    我对 iOS 及其 C 基础很陌生 但对一般编程并不熟悉 我的困境是这样的 我正在基于复杂 AudioUnits 的应用程序中实现回声效果 该应用程序需要混响 回声和压缩等 但是 只有当我使用特定的时 回声才能正常工作音频流基本描述我的应用