使用C

时间:2018-06-18 11:23:28

标签: c file-io wav

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

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

图书馆在这里: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;
}

1 个答案:

答案 0 :(得分:0)

thx查看此帖子。我自己找到了问题,就是这样,我使用char而不是unsigned char作为原始数据(原始字节)。通过将它们转换为int16或int32,我没有考虑符号位。这意味着它们在转换期间并不是完全相同的值,除非是。

解决方法是: 要么留下签名的字符并使用:

buffer[i] & 0xff

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

unsgiend char * buffer;