答案 0 :(得分:4)
我不知道你的代码究竟出现了什么问题而没有看到它,但这会让你在Audacity中打开一个不错的1 KHz正弦波16位PCM:
#include <stdio.h>
#include <math.h>
#ifndef M_PI
#define M_PI 3.14159265358
#endif
int main(void)
{
FILE* f = fopen("sinewave.pcm", "wb");
double t;
for (t = 0; t < 1; t += 1./8000) // 8000 is the sample rate in Hz
{
double sample = 15000 * sin(2 * M_PI * 1000 * t); // 1000 Hz sine wave
short s16 = (short)sample;
unsigned char c;
c = (unsigned)s16 % 256;
fwrite(&c, 1, 1, f);
c = (unsigned)s16 / 256 % 256;
fwrite(&c, 1, 1, f);
}
fclose(f);
return 0;
}
在Audacity中,浏览File-&gt; Import-&gt;原始数据:
编码:签名的16位PCM
字节顺序:Little-endian
频道:1频道(单声道)
采样率:8000
导入。
答案 1 :(得分:3)
答案 2 :(得分:0)
答案 3 :(得分:0)
答案 4 :(得分:0)
僵尸这个帖子:
来自WAV Wiki:
WAV格式存在一些不一致之处:例如,8位数据是无符号的,而16位数据是有符号的
答案 5 :(得分:0)
您必须将代码从浮点数重新采样为整数,这意味着您需要在某个点舍入,以免给信号增加噪声和直流偏移
float sample = out * 256.f; // amplify to new range.
int pcm32 = (int)floorf(sample + .5f); // round and convert to 32 bit pcm.
// saturate just before conversion if possible, that's always safer.
if (pcm32 > SHRT_MAX) pcm32 = SHRT_MAX;
if (pcm32 < SHRT_MIN) pcm32 = SHRT_MIN;
short int pcm16 = (short int)pcm32; // keep the lowest 16 bits
您是否考虑过对振幅使用-1.0到+1.0的标准归一化范围?