ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

生成用于验证 TDM slot 配置的波形

生成用于验证 TDM slot 配置的波形

Qidi Huang 2025.11.17


使用逻辑分析仪测量 TDM 的 BCLKFSYNCSDO引脚上的信号,可以验证 TDM slot 配置及输出是否正确。不过,我们不能使用常规正弦波进行测量,而是要使用一种特殊波形。在这种波形上:有信号的 slot 输出 0xAA;无信号的 slot 输出 0x00。两种 slot 交替,即可在逻辑分析仪上分辨出 slot 个数和宽度。

这种波形正常人也用不上,所以一般需要工程师自己生成。
以下代码可以生成一段 30秒、单声道、16位、48000赫兹 的测试波形:

#include <stdio.h>
#include <stdint.h>
#include <string.h>#pragma pack(push, 1)   // Ensure no padding in WAV header structstypedef struct {char     chunkID[4];      // "RIFF"uint32_t chunkSize;char     format[4];       // "WAVE"
} RIFFHeader;typedef struct {char     subChunk1ID[4];  // "fmt "uint32_t subChunk1Size;   // 16 for PCMuint16_t audioFormat;     // 1 = PCMuint16_t numChannels;uint32_t sampleRate;uint32_t byteRate;uint16_t blockAlign;uint16_t bitsPerSample;
} FmtSubchunk;typedef struct {char     subChunk2ID[4];  // "data"uint32_t subChunk2Size;
} DataSubchunk;#pragma pack(pop)int main() {const char *filename = "tdmCalibration_1c_16b_48k_30s.wav";FILE *fp = fopen(filename, "wb");if (!fp) {perror("Failed to open output file");return 1;}// WAV parametersuint16_t numChannels = 1;uint32_t sampleRate = 48000;uint16_t bitsPerSample = 16;uint32_t durationSec = 30;uint32_t numSamples = sampleRate * durationSec;uint32_t dataSize = numSamples * numChannels * (bitsPerSample / 8);// Prepare WAV headerRIFFHeader riff = {{'R','I','F','F'},36 + dataSize,          // chunkSize = 4 + (8 + SubChunk1Size) + (8 + SubChunk2Size){'W','A','V','E'}};FmtSubchunk fmt = {{'f','m','t',' '},16,                      // PCM1,                       // audioFormat = 1 (PCM)numChannels,sampleRate,sampleRate * numChannels * (bitsPerSample / 8),(uint16_t)(numChannels * (bitsPerSample / 8)),bitsPerSample};DataSubchunk data = {{'d','a','t','a'},dataSize};// Write headersfwrite(&riff, sizeof(riff), 1, fp);fwrite(&fmt, sizeof(fmt), 1, fp);fwrite(&data, sizeof(data), 1, fp);// Create 0xAA-filled audio bufferuint8_t sampleBytes[2] = {0xAA, 0xAA};  // 16bit = 2bytesfor (uint32_t i = 0; i < numSamples; i++) {fwrite(sampleBytes, sizeof(sampleBytes), 1, fp);}fclose(fp);printf("WAV file generated: %s\n", filename);return 0;
}
返回列表