硬汉嵌入式论坛

 找回密码
 立即注册
查看: 2051|回复: 6
收起左侧

[DSP] 请教I2S播放wav时如何调节音量

[复制链接]

33

主题

192

回帖

291

积分

高级会员

积分
291
发表于 2024-6-6 14:07:59 | 显示全部楼层 |阅读模式
已经完成了fatfs+DMA的方式通过I2S播放flash中的wav文件了

接的高音喇叭

目前想问下 如何调整音量?
音频是44.1khz 16bit

之前了解到是振幅决定音量,所以我尝试在f_read到数据后将16bit数据都乘以了一个系数(范围0-1)来控制音量,但是发现播放不对。
请问我这个方式是哪里有问题么?

[C] 纯文本查看 复制代码
[color=#cccccc][backcolor=#1f1f1f][font=Consolas,][color=#6a9955]// Callback function, transfers PCM samples to the audio buffer[/color]
[color=#4ec9b0]uint32_t[/color][color=#cccccc] [/color][color=#dcdcaa]wavFillBuffer[/color][color=#cccccc]([/color][color=#4ec9b0]audio_t[/color][color=#cccccc] [/color][color=#d4d4d4]*[/color][color=#9cdcfe]dest[/color][color=#cccccc], [/color][color=#4ec9b0]uint32_t[/color][color=#cccccc] [/color][color=#9cdcfe]samples[/color][color=#cccccc])[/color]
[color=#cccccc]{[/color]
[color=#cccccc]  [/color][color=#4ec9b0]UINT[/color][color=#cccccc] [/color][color=#9cdcfe]count[/color][color=#cccccc];[/color]
[color=#cccccc]  [/color][color=#c586c0]if[/color][color=#cccccc] ([/color][color=#dcdcaa]f_read[/color][color=#cccccc]([/color][color=#9cdcfe]systemStatus[/color][color=#cccccc].[/color][color=#9cdcfe]file[/color][color=#cccccc], ([/color][color=#4ec9b0]uint8_t[/color][color=#cccccc] [/color][color=#d4d4d4]*[/color][color=#cccccc])[/color][color=#9cdcfe]dest[/color][color=#cccccc], [/color][color=#9cdcfe]samples[/color][color=#cccccc] [/color][color=#d4d4d4]*[/color][color=#cccccc] ([/color][color=#569cd6]sizeof[/color][color=#cccccc]([/color][color=#4ec9b0]audio_t[/color][color=#cccccc])), [/color][color=#d4d4d4]&[/color][color=#9cdcfe]count[/color][color=#cccccc]) [/color][color=#d4d4d4]!=[/color][color=#cccccc] [/color][color=#4fc1ff]FR_OK[/color][color=#cccccc])[/color]
[color=#cccccc]  {[/color]
[color=#cccccc]    [/color][color=#c586c0]return[/color][color=#cccccc] [/color][color=#b5cea8]0[/color][color=#cccccc];[/color]
[color=#cccccc]  }[/color]
[color=#cccccc]  [/color][color=#9cdcfe]count[/color][color=#cccccc] [/color][color=#d4d4d4]/=[/color][color=#cccccc] ([/color][color=#569cd6]sizeof[/color][color=#cccccc]([/color][color=#4ec9b0]audio_t[/color][color=#cccccc]));[/color]
[color=#cccccc]
[/color]
[color=#cccccc]  // 这部分是新加的 [/color][color=#4ec9b0]audio_t[/color][color=#cccccc]是int16_t,测试系数固定0.5[/color]

[color=#cccccc]  [/color][color=#c586c0]for[/color][color=#cccccc] ([/color][color=#4ec9b0]uint32_t[/color][color=#cccccc] [/color][color=#9cdcfe]i[/color][color=#cccccc] [/color][color=#d4d4d4]=[/color][color=#cccccc] [/color][color=#b5cea8]0[/color][color=#cccccc]; [/color][color=#9cdcfe]i[/color][color=#cccccc] [/color][color=#d4d4d4]<[/color][color=#cccccc] [/color][color=#9cdcfe]count[/color][color=#cccccc]; [/color][color=#9cdcfe]i[/color][color=#d4d4d4]++[/color][color=#cccccc])[/color]
[color=#cccccc]  {[/color]
[color=#cccccc]    [/color][color=#9cdcfe]dest[/color][color=#cccccc][[/color][color=#9cdcfe]i[/color][color=#cccccc]] [/color][color=#d4d4d4]=[/color][color=#cccccc] ([/color][color=#4ec9b0]audio_t[/color][color=#cccccc])([/color][color=#9cdcfe]dest[/color][color=#cccccc][[/color][color=#9cdcfe]i[/color][color=#cccccc]] [/color][color=#d4d4d4]*[/color][color=#cccccc] [/color][color=#b5cea8]0.5[/color][color=#cccccc]);[/color]
[color=#cccccc]  }[/color]
[color=#cccccc]
[/color]
[color=#cccccc]  [/color][color=#c586c0]if[/color][color=#cccccc] ([/color][color=#569cd6]sizeof[/color][color=#cccccc]([/color][color=#4ec9b0]audio_t[/color][color=#cccccc]) [/color][color=#d4d4d4]==[/color][color=#cccccc] [/color][color=#b5cea8]4[/color][color=#cccccc])[/color]
[color=#cccccc]  {[/color]
[color=#cccccc]    [/color][color=#c586c0]for[/color][color=#cccccc] ([/color][color=#4ec9b0]uint32_t[/color][color=#cccccc] [/color][color=#9cdcfe]i[/color][color=#cccccc] [/color][color=#d4d4d4]=[/color][color=#cccccc] [/color][color=#b5cea8]0[/color][color=#cccccc]; [/color][color=#9cdcfe]i[/color][color=#cccccc] [/color][color=#d4d4d4]<[/color][color=#cccccc] [/color][color=#9cdcfe]count[/color][color=#cccccc]; [/color][color=#9cdcfe]i[/color][color=#d4d4d4]++[/color][color=#cccccc])[/color]
[color=#cccccc]      [/color][color=#9cdcfe]dest[/color][color=#cccccc][[/color][color=#9cdcfe]i[/color][color=#cccccc]] [/color][color=#d4d4d4]=[/color][color=#cccccc] ([/color][color=#9cdcfe]dest[/color][color=#cccccc][[/color][color=#9cdcfe]i[/color][color=#cccccc]] [/color][color=#d4d4d4]<<[/color][color=#cccccc] [/color][color=#b5cea8]16[/color][color=#cccccc]) [/color][color=#d4d4d4]|[/color][color=#cccccc] ([/color][color=#9cdcfe]dest[/color][color=#cccccc][[/color][color=#9cdcfe]i[/color][color=#cccccc]] [/color][color=#d4d4d4]>>[/color][color=#cccccc] [/color][color=#b5cea8]16[/color][color=#cccccc]);[/color][color=#6a9955] // Fix for DMA order in 32-bit audio[/color]
[color=#cccccc]  }[/color]

[color=#cccccc]  [/color][color=#c586c0]return[/color][color=#cccccc] [/color][color=#9cdcfe]count[/color][color=#cccccc];[/color][color=#6a9955] // count is bytes, samples are 32 bit[/color]
[color=#cccccc]}[/color]
[/font][/backcolor][/color]




回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
116196
QQ
发表于 2024-6-8 01:50:17 | 显示全部楼层
ST音频库,Cube Audio可以看看有没有对应的算法
回复

使用道具 举报

85

主题

784

回帖

1039

积分

至尊会员

积分
1039
发表于 2024-6-11 23:00:42 | 显示全部楼层
先转换成有符号数减去32768,乘上系数再加上32768,然后再试试
回复

使用道具 举报

33

主题

192

回帖

291

积分

高级会员

积分
291
 楼主| 发表于 2024-6-12 10:56:32 | 显示全部楼层
庄永 发表于 2024-6-11 23:00
先转换成有符号数减去32768,乘上系数再加上32768,然后再试试

3q 我试下
回复

使用道具 举报

33

主题

192

回帖

291

积分

高级会员

积分
291
 楼主| 发表于 2024-6-12 11:40:15 | 显示全部楼层
测试情况
*0.5 保存到另外一个文件 进行播放是正常的 没有杂音 且 声音确实小了。
怀疑是因为用了DMA 读文件然后进行计算耗时太久跟不上DMA导致的杂音

源码来自
https://github.com/deividAlfa/ST ... -USB-WAV-MP3-player

定义了一个长数组
I2S DMA开启一半和完成的中断,每DMA完成一半去读wav文件放到数组的一半。
读取后不处理的话没有杂音。
读取后乘以系数会有杂音,提示Buffer underflow!
就是因为DMA传输了 还在处理数据

想问下这个有办法优化么

回复

使用道具 举报

85

主题

784

回帖

1039

积分

至尊会员

积分
1039
发表于 2024-6-12 21:36:02 | 显示全部楼层
LinY 发表于 2024-6-12 11:40
测试情况
*0.5 保存到另外一个文件 进行播放是正常的 没有杂音 且 声音确实小了。
怀疑是因为用了DMA 读 ...

怎么操作可以了?现在还有什么问题什么现象?
回复

使用道具 举报

33

主题

192

回帖

291

积分

高级会员

积分
291
 楼主| 发表于 2024-9-5 09:08:18 | 显示全部楼层
庄永 发表于 2024-6-12 21:36
怎么操作可以了?现在还有什么问题什么现象?

乘以系数这种方案,系数和1的差值越大,音频质量越差。
最好调整声音大小的方案是加一个音量调节的芯片(硬件方案),或者直接保存几个不同音量的对应音频文件(占用存储)。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-6-9 18:57 , Processed in 0.263151 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表