标题:读取.wav文件中的double数据块
只看楼主
a045000zql
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2017-6-28
结帖率:100%
已结贴  问题点数:20 回复次数:6 
读取.wav文件中的double数据块
读取.wav文件中的数据,前44B是文件头,跳过这44字节后面的就是振幅数据块,按照在MATLAB中的显示是double型的数据,所以我用以下程序读写,发现读出的数据完全不对,不知道问题出在哪里,还请各位大神指教。那个sample_size和sample_count都是计算过的,并且文件大小是44144,去除文件头的44字节,正好是数据大小44100.本人对C语言处于刚学阶段,如果有更好的方法,可以告诉我该怎么读取这块的数据吗,万分感谢!
positional_mix21.rar (266.8 KB)


#include "stdlib.h"
#include "stdio.h"

int main()
{
    FILE *fp;
    FILE *fout;

    int i;
    int sample_size;
    int sample_count;
    double value[220500];

    sample_size = 2;
    sample_count = 220500;


    fp=fopen("positional_mix21.wav","rb");
 
    if((fp=fopen("positional_mix21.wav","rb"))==NULL)
    {
        printf("can't open this file\n");
        exit(0);
    }

    fseek(fp,44L,0);
   
    for (i = 0; i < sample_count; i++)
    {
        fread(&value[i], sizeof(double), 1, fp);
    }
   
    fout = fopen("fileToSave.txt", "w");
    for (i = 0; i < sample_count; i++)
    {
        fprintf(fout, "%lf\n", value[i]);
    }
    fclose(fp);
    fclose(fout);
}

[此贴子已经被作者于2017-7-6 18:52编辑过]

搜索更多相关主题的帖子: 读取 wav 文件 double 数据 
2017-07-06 16:32
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:0 
不可能是double类型,头部会指出是什么类型
2017-07-06 18:08
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:0 
看吹水佬的解析 https://bbs.bccn.net/viewthread.php?tid=479141&page=1#pid2636391
你这个wav是双通道,每个数据2bytes
2017-07-06 18:22
a045000zql
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2017-6-28
得分:0 
回复 3楼 rjsp
MATLAB里显示确实是double型的数据,我用二进制读取出来想直接用double型写到另一个文件里。我也得知一个数据2字节,我在sample_size已经表明是2了,所以这也是我所疑惑的地方,既然不可能是double型,为什么MATLAB读出11025*2的double型数据,这岂不是比文件本身大很多。真实伤脑筋,这么多天了,数据就在眼前,但是就是提取不出来。
2017-07-06 18:40
a045000zql
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2017-6-28
得分:0 
我附一张MATLAB读取这个文件得到的数据吧
c.rar (16.16 KB)
2017-07-06 18:48
a045000zql
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2017-6-28
得分:0 
现在一个数也读不出来了
2017-07-06 19:03
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:20 
matlab显示double类型,不等于 wav中存的就是double类型。
我希望你明白这一点,否则我都不想继续说下去了:(

比如,wav文件中第一个数是 58 00 (也就是short类型 +88),而 matlab 显示为 0.0027
那很显然呀,matalb是将 +88 除以了 32767(也就是十六进制的 0x8000,也就是 short 所能表示的最大值)

为什么要除,你应该明白吧?
二字节的 0x4000,表示最大响度的一半
四字节的 0x4000,连最大响度的万分之一都不到
所以,matlab就多事的帮你除了一下。
2017-07-07 16:26



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-479216-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.314016 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved