器件型号: PCMD3140
我目前正在集成 PCMD3140IRTER 编解码器、并且在配置 VAD(语音活动检测器)的灵敏度时遇到问题。
尽管我已经验证了页面 0x09 已正确选择、并且所需的值已写入阈值寄存器 (0x50、0x51、0x52、0x53)、但 VAD 的灵敏度比预期高得多:
- 设置 0dB 的阈值时、VAD 非常敏感并生成连续中断。
- 将阈值移到–8dB 时、灵敏度会进一步增加。
- 将阈值下限设置为–20dB、VAD 突然变为“耳聋“、完全停止生成中断。
似乎阈值更改未正确应用、或者灵敏度标度与 www.ti.com/.../sbaa490a.pdf 不一致 。
我附加了在 tlv320adcx140.c 驱动程序中实现的代码、规定即使手动写入寄存器(绕过驱动程序)、我也会复制相同的行为。
可能的原因是什么、在 0dB 时具有非常敏感的 VAD 行为是正确的吗? 提前感谢您的支持。
static u32 db_to_linear(int db_value)
{
static const u32 db_table[] = {
16777216, // 0 dB
14952709, // - 1 dB
13326616, // - 2 dB
11877359, // - 3 dB
10585708, // - 4 dB
9434522, // - 5 dB
8408526, // - 6 dB
7494107, // - 7 dB
6679130, // - 8 dB
5952781, // - 9 dB
5305422, // - 10 dB
4728462, // - 11 dB
4214246, // - 12 dB
3755951, // - 13 dB
3347495, // - 14 dB
2983458, // - 15 dB
2659010, // - 16 dB
2369845, // - 17 dB
2112126, // - 18 dB
1882435, // - 19 dB
1677722, // - 20 dB
};
if (db_value > 0 || db_value < -20)
return 16777216;
return db_table[-db_value];
}
static ssize_t vad_threshold_store(struct device *dev,
struct device_attribute *attr,
const char *buf,
size_t count)
{
struct adcx140_priv *adcx140 = dev_get_drvdata(dev);
int db_value;
u32 threshold;
int ret;
unsigned int val;
unsigned long flags;
ret = kstrtoint(buf, 0, &db_value);
if (ret)
return ret;
if (db_value > 0 || db_value < -20) {
dev_err(dev, "Threshold out of range (0 to -20 dB): %d\n", db_value);
return -EINVAL;
}
threshold = db_to_linear(db_value);
regmap_write(adcx140->regmap, 0x4D0, (threshold >> 24) & 0xFF);
regmap_write(adcx140->regmap, 0x4D1, (threshold >> 16) & 0xFF);
regmap_write(adcx140->regmap, 0x4D2, (threshold >> 8) & 0xFF);
regmap_write(adcx140->regmap, 0x4D3, threshold & 0xFF);
regmap_read(adcx140->regmap, ADCX140_INT_LTCH0, &val);
return count;
}

