我目前正在使用.WAV文件,我有一个问题。
我接近这个的方法是创建一个包含信息的结构:
typedef struct header_file{
char chunk_id[4];
int chunk_size;
char format[4];
char subchunk1_id[4];
int subchunk1_size;
short int audio_format;
short int num_channels;
int sample_rate;
int byte_rate;
short int block_align;
short int bits_per_sample;
char subchunk2_id[4];
int subchunk2_size;
}header;
typedef struct header_file* wav_p;
现在,我试图像以下那样运行WAV文件:
ofstream myFile;
myFile.open("file.txt");
FILE * file = fopen("file.wav", "rb");
const int BUFFSIZE = 256;
int count = 0;
short int buff[BUFFSIZE];
wav_p wav = (wav_p)malloc(sizeof(header));
int nb;
if (file)
{
fread(wav, 1, sizeof(header), file);
while (!feof(file)){
nb = fread(buff, 1, BUFFSIZE, file);
count++;
for (int i = 0; i<BUFFSIZE; i += 1){
//the following part i found on the internet so i'm not sure if it is good
int h = (signed char)buff[i + 1];
int c = (h << 8) | buff[i];
double t = c / 32768.0;
myFile << t << endl;
if(abs(t)>1){
//checking that a value is between -1 to 1
}
}
}
}
fclose(file);
myFile.close();
我的问题是:内部for
是否正确?在file.txt
中,我的所有值都在-1到1之间,所以我认为它很好,但我不确定,我是否正确地检查了.wav文件并按照我在#34; file.txt的&#34;很好(&#34; file.txt&#34;包含&#34; y轴&#34;文件功能的值,其中&#34; x轴&#34;是时间)
答案 0 :(得分:1)
您的代码大部分是正确的。您没有检查wav标头以验证波形文件实际上是否包含16位样本。
您计算16位值是错误的,因为buff
是short int
的数组。如果buff
是char
数组,那么您使用的计算是正确的(但是您必须将i
增加2)。
使用short int
数组,您只需说int c = buff[i];
,除非您的系统是大端系统。
由于-1.0&lt; = abs(t) > 1
&lt; c
,因此无需检查select = inv[int(item)-1]
1.0。