我有一个连接到 ATmega 微控制器的 MP3 板,该微控制器还连接到一个电位器。MP3 板直接通过其板载扬声器播放 MP3 数据,因此我还可以设置输出音量。
所以,正如你可能猜到的,我从 poti 读取值并将其转发给微控制器。不幸的是,微控制器不会以线性方式增加音量。因此,从值 0 到 128,您几乎听不到任何声音,而从 128 到 255(最大),音量会迅速增加。
我发现,下面的函数可以解决这个问题:
vol = 1 - (1 - x)^4
但 x 必须介于 0 和 1 之间,结果也介于 0 和 1 之间。
由于我在微控制器上,我想
- 转换这个公式,以便我可以将它与无符号整数一起使用
- 优化它(也许使用一些便宜的二进制函数),因为我每秒多次读取poti值。所以这个函数必须每秒计算多次,我也想用微控制器做其他事情;-)
也许你们中的一些人有一个想法?会很好!
uint8_t linearize_volume(uint8_t value) {
// ideas?
// please don't use bigger data types than uint16_t
}