问题标签 [i2s]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1865 浏览

embedded - ESP32 I2S 音频播放中的失真与外部 DAC 的采样频率高于 20kSps

硬件:ESP32 DevKitV1、PCM5102 分线板、SD 卡适配器。
软件:Arduino 框架。

一段时间以来,我一直在努力使用 ESP32 外部的 I2S DAC 播放音频。问题是我只能在不失真的情况下播放低采样频率,即低于 20kSps。我一直在研究文档https://docs.espressif.com/projects/esp-idf/en/latest/api-reference/peripherals/i2s.html和许多其他来源,但仍然没有设法解决这个问题.

I2S配置功能:

打开以 16 位单声道 PCM、44.1kHz 格式创建的波形文件:

在主循环中,样本被馈送到 I2S 驱动程序。

这适用于高达 20 kSps 的采样率。对于 32k 或 44.1k 的采样率,会出现严重失真。我怀疑这是由 I2S DMA Tx 缓冲区引起的。如果增加 DMA 缓冲区的数量 (dma_buf_count) 和缓冲区长度 (dma_buf_len),则声音一开始播放得很好。随后,在很短的时间后,失真再次出现。我无法测量这么短的时间跨度,可能大约一秒钟,但我确实注意到它取决于 dma_buf_count 和 dma_buf_len。

接下来,我尝试将CPU频率提高到240MHz,没有任何改善。此外,我尝试从 SPIFSS 播放文件,没有任何改进。

我现在没有想法,有没有人也遇到过这个问题?

0 投票
0 回答
375 浏览

audio - stm32 SD卡混音

我正在尝试通过 SDIO 从我的 SD 中读取 2 个带有 FATFS 的文件并混合 16 位 PCM 音频数据。它可以工作,但输出声音在播放 2 个文件时速度较慢,听起来不太好。

我使用 I2S 将数据发送到 IC。我的 Buffersize 是 4096。如果不混合 2 个缓冲区,音频质量就很好。当我使用该示例混合我在网上找到的缓冲区时,您会听到很多噪音。

有任何想法吗?

我的代码:

I2S 回调发送下一个缓冲区

0 投票
0 回答
79 浏览

c++ - 嵌入式系统:WDT / sleep fct 后声音丢失

我希望这里有一些在嵌入式系统方面有高级经验的人:我设计了一个带有 Atmel Samd21 MCU 的 PCB,它应该通过放大器 TAS5805(通过 i2s 连接)播放 .wav 文件。.wav 文件通过 DMA(来自 SD 卡的数据)运行。一切正常,我可以听到我选择的声音。但是当我开始运行看门狗定时器或睡眠功能时,之后我就听不到我的声音了,即使我之前再次禁用了 WDT。

我的问题是:初始化另一个时钟会影响 MCU 中的时钟吗?我猜 RT 时钟和 i2s 同步有一些问题。有人有类似的问题并且知道如何解决吗?我很感激每一个建议/方法。

我还附加了一个测试代码。也许这有助于理解我在说什么。

谢谢!

0 投票
1 回答
548 浏览

c - 在 C 中将立体声 wav 转换为单声道

我使用 C 语言为专有的实时操作系统 (RTOS) 开发了同步音频接口 (SAI) 驱动程序。我的驱动器配置为向放大器输出左右声道数据 (I2S)。但是,由于连接的放大器是单声道的,它只向扬声器输出左声道或右声道音频数据。现在,我有一个立体声 PCM 16 位音频数据文件,我想在我的应用程序中以某种方式混合左声道和右声道音频数据,并将其发送到 SAI 驱动程序中的左声道或右声道。通过这种方式,我将能够在连接到单声道放大器的扬声器上将组合的立体声音频数据作为单声道播放。

谁能建议我最好的解决方案是什么?

0 投票
1 回答
72 浏览

embedded - I2S 数据结构(IC 间声音)

I2S 有大量的电气描述;但是,我找不到有关数据格式/结构的信息。我所说的格式是,串行数据线上的值是什么意思?这些值是否包含有关音量、音高或其他内容的信息?

作为应用示例,我有一个 .wav 音频文件。我解压文件并获得了数据样本流。这个样本数据应该如何在 I2S 上传输,以便接收器可以播放音频?0x 0011 2233 4455 6677 8899 AABB CCDD EEFF 0011 2233 4455 ... 等等。这些值是否应该以某种对接收者有意义的方式格式化?可能是 0x0011____、0x2233____ 之类的东西,其中空白表示其他杂项信息?

让我们假设 I2S 标准的情况,每个样本 24 位。任何信息都有帮助。谢谢。

0 投票
0 回答
633 浏览

stm32 - 带DMA的STM32 I2S播放慢

我想用 STM32 实现一个 WAV/MP3 播放器(现在我们只说 WAV),它用 FATFS 从 SD 读取它,然后用 DMA 将它传输到 I2S 缓冲区。

问题是,当我插入扬声器时,它会以正确的音高(音调)播放歌曲,但速度很慢,而且还会发出奇怪的重复滴答声,就像缓冲区被缓慢填充,或者播放缓慢,但使用了正确的频率。

我使用 STM32_F4VE(STM32F407VET6) 和 PCM5102(只需要 DATA,16 位的 32xfs 的 BCK 和 fs 的 LRCK)

这里我附上几个代码部分:main.c

播放器.c

0 投票
1 回答
94 浏览

audio - PIC32MX:SPI1CON.SPIBUSY 位永远不会被清除

我正在尝试使用 PIC32MX250F128B 通过 I2S 与 DAC+放大器从模块 (MAX98257) 通信来生成简单的正弦波声音。最终目标是为学校项目制作带键盘的合成器。

我用 MPLABX (v.5.40) 创建了一个基本项目我现在没有使用 Harmony 或任何其他框架,我只是想拥有一个基本的声音生成、工作代码。

这是代码:

微控制器配置位:

SPI/I2S 配置 + 代码:

模拟行为: 在模拟中,代码似乎工作正常,但是状态寄存器(SPI1STAT)中的所有位都为 0,并且始终保持为 0(包括 SPIBUSY),这很奇怪。

目标行为: 我正在用面包板上的 Pickit3 对 PIC32 进行编程(ICSP,没有开发板)。我遵循数据表中指定的 PIC32MX 的基本连接,并连接了 DAC

我注意到:

  • 在我用 sinetable 中的第一个值填充 SPI1BUF 后设置 SPIBUSY。
  • 我没有在手表窗口中看到缓冲区(SPI1BUF)的值发生变化,而在模拟中我看到了(但这可能是正常的 idk)
  • 程序卡在 while 循环中,因为 SPIBUSY 永远不会被清除

所以在模拟中,它似乎工作正常,可能是因为 SPI1BUSY 位永远不会改变(就像其他状态位一样)。

对于目标,状态位似乎工作,除了永远不会被清除的 SPI1BUSY。

知道为什么会这样吗?谢谢

0 投票
1 回答
428 浏览

sampling - 使用 I2S 以不同速率对 ESP32 上的模拟信号进行采样

我需要阅读高频。来自一个 ADC1 通道的模拟信号数据并读取低频。来自其他 ADC1 引脚的数据。
我使用 I2S 的高频。数据读取,运行完美,但一旦配置 I2S,所有其他 ADC1 引脚仅读取 4095。
对我的要求的正确处理是什么?
由于wifi,无法使用ADC2。

代码摘录:

0 投票
1 回答
750 浏览

sd-card - 与 ESP32、I2S MEMS-mic 和 SD 卡(FreeRTOS、PlatformIO、ESP-PROG)同步缓冲传输

我知道这个论坛不喜欢这样的“开放式”问题,但我希望有人能帮我解开我的心结,非常感谢。

目标很简单:

  • 从 2 个 adafruit sph0645 麦克风读取立体声 32 位 44100 S/s I2S 信号
  • 创建一个 wav-header 并将数据存储到 SD 卡上

我已经在这几天了,我知道这将比我最初想象的要复杂得多。主要原因:信号质量。像大多数关于这个主题的教程一样,这些麦克风最简单的“hello world”是对 I2S 样本的循环轮询。轮询、填充缓冲区、通过串行输出或写入 SD 卡。这会返回一个断断续续、嘈杂、加速的 RL 音频版本。内部 DMA 缓冲区的填充可以看作是恒定的,但其余大部分是混乱的,所以

如何将这些 DMA 缓冲区与我的其余代码同步?

根据 STM32 HAL 的经验,我想一些寄存器可以设置为在缓冲区满时引发中断,或者可以通过队列在任务之间发送事件。关于这个主题的例子要么在一个主循环中轮询单声道一个糟糕的采样率和位深度,要么使用过度杀伤代码页面并且从不解决它的作用,“只需复制它就可以工作”,不好。ESP32-Arduino 框架是否提供了一些正确的方法?espressif 文档并不值得期待,因为它们的一些 I2S 接口函数甚至不起作用(如果您也在研究这个主题,您也可能已经注意到 i2s_read 只返回零)。只是对正确方向的提示会有所帮助,无论如何我正在编写自己的代码。中断?事件?计时器?轮询完整缓冲区?只有你可能知道。

有一个好的,thx

0 投票
0 回答
159 浏览

esp32 - 有人有使用 sph0645(i2s 麦克风)和 esp32-s2 的经验吗?

我正在尝试使用 ESP32-S2 WROOM(全名:LilyGO TTGO T8 ESP32-S2 WROOM)从 i2s 麦克风(sph0645)读取输入,我得到的只是静音或噪音(如果分配的引脚不在麦克风适合)所以我认为连接必须正确。我收到 1 条错误消息,即E (10715) AUDIO_ELEMENT: [wav] Element already stopped。在 espressif 论坛上找不到这个错误消息,所以我有点绝望:P 也很高兴知道这是我关于这个主题的第一篇文章。因此,如果您对如何使这两个组件(i2s 麦克风和 esp32-s2)工作有更多了解,请随意!

为了完成这个故事,这是完整的日志。