使用C写入wav文件期间的量化噪声
Quantization noise during writing wav file using C
我只是想写一个用于读写 Wav 文件的库(只是需要它来进行音频处理),就像测试一样,我从 Wave 文件中读取样本并将它们转换为双倍(只是将它们标准化为 - 1 ~ 1),除了将它们转换回整数外什么都不做,根据每个样本的位数(假设 Wav 文件每个样本有 N 位,我将它们除以 2^(N-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;
}
感谢观看此 post。我自己发现了问题,就是我使用 char 而不是 unsigned char 作为原始数据(原始字节)。通过将它们转换为 int16 或 int32,我没有考虑符号位。这意味着它们在转换过程中并不完全相同,除了是。
解决方法是:
要么留在 signed char 并使用:
buffer[i] & 0xff
获取正确的原始数据进行转换,或将char类型更改为unsigned char:
unsgiend char * buffer;
我只是想写一个用于读写 Wav 文件的库(只是需要它来进行音频处理),就像测试一样,我从 Wave 文件中读取样本并将它们转换为双倍(只是将它们标准化为 - 1 ~ 1),除了将它们转换回整数外什么都不做,根据每个样本的位数(假设 Wav 文件每个样本有 N 位,我将它们除以 2^(N-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;
}
感谢观看此 post。我自己发现了问题,就是我使用 char 而不是 unsigned char 作为原始数据(原始字节)。通过将它们转换为 int16 或 int32,我没有考虑符号位。这意味着它们在转换过程中并不完全相同,除了是。
解决方法是: 要么留在 signed char 并使用:
buffer[i] & 0xff
获取正确的原始数据进行转换,或将char类型更改为unsigned char:
unsgiend char * buffer;