[問題] wav讀取問題

看板C_and_CPP作者 (.....)時間14年前 (2011/04/01 09:21), 編輯推噓3(308)
留言11則, 5人參與, 最新討論串1/1
最近在寫一個音訊處理的程式 在讀取wav資料的時候遇到了個問題 程式碼如下 input = fopen("C:\\sig+n.wav", "rb"); if (!strcmp(id, "RIFF")){ fread(&size, sizeof(unsigned long), 1, input); fread(id, sizeof(char), 4, input); id[4] = '\0'; if (!strcmp(id,"WAVE")){ fread(id, sizeof(char), 4, input); fread(&format_length, sizeof(unsigned long),1,input); fread(&format_tag, sizeof(short), 1, input); fread(&channels, sizeof(short),1,input); fread(&sample_rate, sizeof(unsigned long), 1, input); fread(&avg_bytes_sec, sizeof(unsigned long), 1, input); fread(&block_align, sizeof(short), 1, input); fread(&bits_per_sample, sizeof(short), 1, input); fread(id, sizeof(char), 4, input); fread(&data_size, sizeof(unsigned long), 1, input); fread(&data, sizeof(short), 3, input); data[3] = '\0'; printf("%d %d %d\n", data[0], data[1], data[2]); } else{ printf("Error: RIFF file but not a wave file\n"); } } else{ printf("Error: not a RIFF file\n"); } wav header的44個byte都已經按照格式讀取出來了 可是接下來所讀出來的資料 卻和用matlab的wavread的結果相差甚遠 舉例來說 我data陣列裡的第一筆資料是778 matlab裡的是0.0235 想請問各位高手 在c當中讀取出來的音訊檔需要在做甚麼處理嗎 不然以short型式讀取出來的資料怎麼有小數點? 謝謝大家 拜託大家幫幫忙 這個問題困擾了很久 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 112.78.95.9

04/01 10:17, , 1F
以PCM的值域來說, 778 是合理的
04/01 10:17, 1F

04/01 10:19, , 2F
matlab 的值會不會有先除過 32768 ?
04/01 10:19, 2F

04/01 11:23, , 3F
是除過 32768 沒錯 這裡的 sample 值在 matlab 化為 0~1
04/01 11:23, 3F

04/01 11:24, , 4F
而實際存放時是(以你的16-bit)是 0~32767
04/01 11:24, 4F

04/01 11:24, , 5F
因此在 matlab 就會除過 32768
04/01 11:24, 5F

04/01 12:11, , 7F
可以用 wavread(filename, 'native') 就會跟C一樣
04/01 12:11, 7F

04/01 15:42, , 8F
你很喜歡把文章類別刪掉喔...請不要這樣做
04/01 15:42, 8F

04/01 16:41, , 9F
感謝樓上各位 終於了解是怎麼回事了
04/01 16:41, 9F

04/01 16:42, , 10F
版主不好意思 發文時enter按太快 沒選到分類
04/01 16:42, 10F

04/01 16:42, , 11F
下次會注意 抱歉
04/01 16:42, 11F
文章代碼(AID): #1DbIX-y6 (C_and_CPP)