uint8_t 中传输的音频转换为 .wav 文件

Audio transmitted in uint8_t into a .wav file

我正在尝试使用 CAN FD 传输音频,它发送的数据格式为 uint8_t,而我使用 ADC 从麦克风获取的样本是 uint32_t。在使用 CAN FD 传输后,尝试将此 uint8_t 数据插入到 wav 中会有任何问题吗?我试图用数据创建 .wav,但我只听到噪音。

这是我用简单的 64 字节 CAN FD 消息创建的 .wav 文件的图像。

.wav file

我知道只引入 64 个字节对于 .wav 来说是一个非常小的数量,但我不知道如何将更多数据连接到缓冲区中以获得更大的文件。 这是我用来创建 .wav

的函数
void write_little_endian(unsigned int word, int num_bytes, FILE *wav_file)
    {
        uint16_t buf;
        while(num_bytes>0)
        {   buf = word & 0xff;
            fwrite(&buf, 1,1, wav_file);
            num_bytes--;
        word >>= 8;
        }
    }

void write_wav(char * filename, unsigned long num_samples, short int * data, int s_rate)
    {
        FILE* wav_file;
        unsigned int sample_rate;
        unsigned int num_channels;
        unsigned int bytes_per_sample;
        unsigned int byte_rate;
        unsigned long i;    /* counter for samples */

        num_channels = 1;   /* monoaural */
        bytes_per_sample = 1;

        if (s_rate<=0) sample_rate = 16000;
        else sample_rate = (unsigned int) s_rate;

        byte_rate = sample_rate*num_channels*bytes_per_sample;

        wav_file = fopen(filename, "wb");
        assert(wav_file);   /* make sure it opened */

        /* write RIFF header */
        fwrite("RIFF", 1, 4, wav_file);

        write_little_endian(36 + bytes_per_sample* num_samples*num_channels, 4, wav_file);
        fwrite("WAVE", 1, 4, wav_file);

        /* write fmt  subchunk */
        fwrite("fmt ", 1, 4, wav_file);

        write_little_endian(16, 4, wav_file);   /* SubChunk1Size is 16 */
        write_little_endian(1, 2, wav_file);    /* PCM is format 1 */
        write_little_endian(num_channels, 2, wav_file);
        write_little_endian(sample_rate, 4, wav_file);
        write_little_endian(byte_rate, 4, wav_file);
        write_little_endian(num_channels*bytes_per_sample, 2, wav_file);  /* block align */
        write_little_endian(8*bytes_per_sample, 2, wav_file);  /* bits/sample */

        /* write data subchunk */
        fwrite("data", 1, 4, wav_file);
        write_little_endian(bytes_per_sample* num_samples*num_channels, 4, wav_file);
        for (i=0; i< num_samples; i++)
        {   write_little_endian((unsigned int)(data[i]),bytes_per_sample, wav_file);
        }

        fclose(wav_file);
    }

我发送这个命令来调用它,我收到了我将要在下一张图片上 post 的内容:

write_wav("test.wav", 44100, (short int *)buffer, 44100);

.wav with a bigger buffer of 44100 samples of uint16_t

但是当我播放这个文件时,音频只是哔哔声和噪音,不是我的声音 :(

更新=经过一些尝试,我认为问题出在我通过 CAN FD 发送的数据上。我看过另一个 .wav 中的数据,格式看起来与我的不相似。我不知道如何通过 uint8_t 格式的 CAN FD 数据字段发送我用 ADC 获取的 uint32_t 数据。我试过投射数据,但我不知道如何为 .wav 准备数据。有人可以帮我吗?我应该用 uint8_t 发送它,然后在将它插入 .wav 之前返回 uin32_t 吗?

这取决于你需要什么样的采样率。在 5 Mbps 波特率、11 位标识符、64 字节数据下,有效负载将以大约 4 Mbps 的速度传输(这可以相当准确地计算出来)。 MCU 需要一些执行时间来处理它,但这可能可以忽略不计。也就是说,实时规格远远超过了人耳停止听到任何差异的采样率。您的问题与选择 CAN FD 作为 hardware/datalink 层无关。你也可以用经典的 CAN 来做到这一点。

显然不传输 文件 原始数据 。播放前只需要转成文件即可。