c - 使用C编写wav文件时的量化噪声

标签 c file-io wav

我只是想编写一个用于读取和写入Wav文件的库(只需要它来进行音频处理),​​就像测试一样,我从Wave文件中读取样本并将它们转换为 double (只需将它们标准化为-1~ 1),然后根据每个样本的位数将它们转换回整数(假设 Wav 文件每个样本有 N 位,我将它们除以 2^(N-1)-1 并在之后乘以相同的因子恢复它)

但问题是,我得到一个带有背景噪声的 wav 文件(我说它看起来像是量化噪声),我不知道为什么,你能帮我找出来吗?

图书馆在这里:https://pastebin.com/mz5TWMPN 头文件是:https://pastebin.com/Lr2tbmnv

演示主要功能如下:

#include <stdio.h>
#include <math.h>
#include "wavreader.h"

#define FRAMESIZE 512

int main()
{

    FILE *fh;
    FILE *fhWrite;
    struct WavHeader * header;
    struct WavHeader * newHeader;
    double frame[FRAMESIZE];
    int iBytesWritten;
    int i;
    char test;
    fh = fopen("D:/ArbeitsOrdner/advanced_pacev/AudioSample/spfg.wav", "rb+");
    if (fh == NULL)
    {
        printf("Failed to open organ.wav\n");
        return 1;
    }

    fhWrite = fopen("D:/ArbeitsOrdner/MyC/test_organ.wav", "wb+");
    if (fhWrite == NULL)
    {
        printf("Failed to create test_organ.wav\n");
        return 1;
    }

    header = readWaveHeader(fh);
    printWaveHeader(header);

    newHeader = createWaveHeader(header->iChannels, header->iSampleRate, header->iBitsPerSample);
    WaveWriteHeader(fhWrite, newHeader);

    while (WaveReadFrame(fh, header, FRAMESIZE, frame) != -1)
    {
        iBytesWritten = WaveWriteFrame(fhWrite, newHeader, FRAMESIZE, frame);
        if (iBytesWritten < 0)
        {
            printf("Error occured while writing to new file\n");
            return 1;
        }
    }    

    WaveWriteHeader(fhWrite, newHeader);

    fclose(fhWrite);
    fclose(fh);

    return 0;
}

最佳答案

感谢您查看这篇文章。我自己发现了问题,那就是,我使用 char 而不是 unsigned char 来表示原始数据(原始字节)。通过将它们转换为 int16 或 int32,我没有考虑符号位。这意味着它们在转换过程中并不完全相同。

解决办法是: 要么保留签名字符并使用:

buffer[i] & 0xff

获取正确的原始数据进行转换,或将 char 类型更改为 unsigned char:

unsgiend char * buffer;

关于c - 使用C编写wav文件时的量化噪声,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50908378/

相关文章:

ubuntu - 使用 ffmpeg 从 wav 文件中完全删除高频

java - 将带有音频的数组列表转换为 .wav 文件(Java)

c - 如何使用 NULL 分配数组

c - 将文件中的空格分隔字符串读取到单个变量中

Java无法读取完整文件

.net - 需要 : File system interfaces and implementation in . NET

c - xcode上C程序的逻辑错误

c - (C) 获取矩阵中一行的 3 个最小元素,并随机选择一个

c# - 使用 System.Data.SQLite 在 C# 应用程序中缓慢打开 SQLite 连接

audio - gstreamer 将多 channel wav 文件拆分为单独的 channel 并将每个 channel 编码为 mp3、alac 等并保存到文件