您好!
我有一个 PIC MCU 连接到编解码器、所有工作正常、编解码器获得正确的时钟、MCU 设置编解码器上的寄存器、输出8kHz-8位数字音频。 此音频会记录到 SD 卡中。 如果我听音频、这是我录制的内容、但在8kHz 8位有符号 PCM 中。
我有两个问题:
问题1:噪音
PIC MCU 使用第三方 SD 卡驱动程序。 来自 MCU 的采样数据由 SD 驱动器存储在 MCU RAM 中的缓冲区中、当驱动器采样并累加512字节数据时、驱动器会自动将缓冲区转储到 SD 卡。 SD 驱动程序使用高速 SPI。 不确定需要多长时间、但由于我是实时录制音频、因此速度非常快。
现在、情况是、当我在连接麦克风的情况下进行录制时、听到高速咔嗒声、当我听到音频时、 我不连接麦克风来模拟死空气、但即使在连接麦克风的真实"死空气"录制中、我也能听到这个问题。 只是当没有连接麦克风时、它的音频和视觉效果更清晰。
当我在 Audacity 等音频播放器中打开原始音频文件时、似乎每512个字节就会出现两个字节错误。 它们不是"额外的"字节、只是不是它们应该是什么。 我知道、由于 MCU 具有"采样字节计数器"和"写入字节计数器"、因此它们是错误的(而不是额外的字节)。 当我停止记录时、采样的字节数等于写入的字节数。 如果这两个"垃圾"字节是额外的字节、则写入的数据将大于采样数据。
从我的观察中可以发现、这两个垃圾字节之间始终相隔10个字节。 然后再增加512个字节、同样是相隔10个字节的两个字节。 按照我的采样速度、在第一个垃圾字节结束和第二个垃圾字节开始之间、每秒10字节/8000字节为1.25毫秒。
因此、为了确保问题不在我的 MCU 代码中、我对其进行了更改、以便在8位数据被采样并以字节的形式存储后、该值将其更改为0x00。 因此、每次512字节的数据被写入 SD 卡、而不是写入任何被采样的数据、它都会写入512字节的0x00。 当我停止录制并查看原始文件时、事实证明它实际上是0x00的512字节、因此对我来说、问题是指向编解码器的上游。
如果我现在更改代码并返回到写入实采样数据而不是0x00、我想知道、当数据写入 SD 卡时、 高速 SPI 总线在某种程度上会在音频路径中引入噪声、该噪声由 MCU 进行采样、最终会破坏之前的第512个字节和第10个字节(也是在512字节间隔内)... 就像 在卡上写入完整的512字节缓冲区需要1.25毫秒一样.... 在这个1.25毫秒内访问 SPI 总线、引起噪声并破坏两个字节。
如果我在十六进制编辑器中打开记录的"静音"文件、则"静音"采样为0x79、垃圾字节为0x78和0x7A。 它是重复的、一致的、并且每次都可以重现。 但我无法确定它在哪里/什么/为什么。 以下是直接从我的文件中以 ASCII 格式显示的内容:
X:0x78、y:0x79、z:0x7A
xyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyxyyyyyyyyyyyyyyyyz
上述模式非常一致地重复。 注意:浏览文件时、在极少数情况下、我可能有两个连续的"x"或两个连续的"z"。 但这两者之间的时序在512字节时看起来非常一致。
这是否由电路的布线方式引起? 我制造了它、它是0.8mm 厚 PCB 中的6层。
问题2:直流偏移
当对字节进行采样时、在将其存储在缓冲区中之前(在写入 SD 卡之前)、我将字节转换为带符号的 PCM、因此任何采样<= 127、我向其添加128、否则减去128。
代码:
if (Audio.SampledByte[0]<= 127)
{
audio.SampledByte[0]+= 128;
}
其他
{
audio.SampledByte[0]-= 128;
}
当我使用十六进制编辑器查看文件中的原始数据时、音频上似乎存在6位直流失调电压、因为当记录静音(或未连接麦克风)时、数据应为0x7F (127)、而是0x79。 因此"0"电平为0x79。 当我在音频编辑器中查看该文件时、可以清楚地看到信号的直流偏移比其中心低5位。 这似乎不会导致问题、但我认为这不是正常现象、这可能会影响接近最小值的字节。
我的麦克风(Knowles EG 系列麦克风)与输入端串联的0.47uF 电容器直流耦合。
我的问题:
1) 1)是否有关于音频路径上产生的噪声的任何想法? 我的解释和推理是否有意义?
2) 2) 编解码器中是否有方法通过寄存器告知其添加直流失调电压?
谢谢!
本