精华内容
下载资源
问答
  • 主要可以分析wav文件的相关参数,修改wav文件的采样位数和声道数。
  • Wav采样率转换

    千次阅读 2012-03-26 18:13:33
    在网上关于采样率转换的资料找的也是纠结。。。坑爹的没一个能让人看懂,在实现原理上看到“卷积”的时候就直接gg思密达了,果断跳之。。。 最后找了个斯坦福的resample开源工具,结束痛苦!  大概介绍一下Wav...

         倒腾了一天的格式转换问题,起因是合成的音频文件不适合在平台上播放,得需先转换到合适的音频格式。之前还真没干过音频处理的事情,摸索起来有点难度。在网上关于采样率转换的资料找的也是纠结。。。坑爹的没一个能让人看懂,在实现原理上看到“卷积”的时候就直接gg思密达了,果断跳之。。。 最后找了个斯坦福的resample开源工具,结束痛苦!

         大概介绍一下Wav头文件:

           

           resample工具负责对音频数据进行重新采样,在具体的格式转换中还需要更改wav文件的header数据,当中的chunkSize、sampleRate、byteRate、subchunk2Size都需要重新计算更改,要不然生成的文件肯定播放不了的。之前测试的时候就卡在这了。。。

     

     

     

    resample:https://ccrma.stanford.edu/~jos/resample/

     

    展开全文
  • 目录wav采样数据转化为wav文件编程前的问题思考 wav采样数据转化为wav文件 在前一篇文章的基础之上,我们已经成功的将wav文件中的采样数据成功提取了出来,并将每个样值以文本的形式保存在了txt文本当中,方便与后期的...

    开始与结束的终章(El Psy Congroo)

    这篇文章其实很重要,这篇文章的功能最后虽然未能实现,但是这篇文章的思考和感悟对于我整个毕设论文都有着举足轻重的作用。毕设论文查重报告已经通过,在此发出本篇文章,为后来者点亮一束灯塔中的光。

    在前一篇文章的基础之上,我们已经成功的将wav文件中的采样数据成功提取了出来,并将每个样值以文本的形式保存在了txt文本当中,方便与后期的研究.接下来我们要尝试将保存的wav文件的采样数据转化为原本的wav文件,当然也可以将别的音频信号的采样数据也转化为wav文件.下面我们开始我们的编程工作.

    编程前的问题思考

    在经过了大量的编程实践以及学习以后,我越发明白了编程其实只是最后的一步实现工作.重要的是要明白自己编程到底要实现一个怎么样的工作,要把需求想清楚并细化,这是极其重要的一点.下面进行本次功能实现前的问题思考.

    1、我们已经将wav文件中的采样数据提取了出来,并将每个样值转化为了一个个文本数据保存在了文件当中.然后现在我们需要将这些样值又转化为原本的wav文件.说实话,我觉得这样挺麻烦,我原本的想法直接把采样数据全部保存成二进制数据不就好了,再转化为原本的wav文件只需要把采样数据写回data区不就好了.后来询问了指导老师后,明白了这是为我软件后期功能所做的准备,因为软件核心功能是要实现能够修改wav文件的声道数,采样频率等参数,于是将数据保存为这种格式是有必要的,接下来我们需要思考一下又如何将我们保存好的文本数据重新写回data数据区呢?

    2、之前我将自己提取的data区数据以一行64个采样值,每个采样值之间用空格分开的方式保存了data区的所有采样数据。我们需要将我们保存的采样值一个个先转化为二进制数据,然后再一个个写回data区就可以了。此处考虑是几周前的想法了,现在的话,我觉得使用fgets和fputs函数,一个从文件读取数据到数组里,另外一个输出到wav文件里面就好了。

    存储方式:要将其最终写回到data区,首先我想提一下data区的数据采取小端序的方式存储,也就是低位数据保存在低地址上,高位保存在高地址上(具体可以查看我写的大端序和小端序的文章)。

    3、测试方式:这个函数的功能实现将我们提取得到的data区数据存回原来的wav文件,可以将测试的wav文件复制一份,等data区数据回写后,用播放器播放看音乐是否相同。

    函数

    fgets

    函数原型
    char *fgets(char *str, int n, FILE *stream);

    参数
    str-- 这是指向一个字符数组的指针,该数组存储了读取得到的字符串。
    n-- 这是要读取的最大字符数(包括最后的空字符)。通常是使用以 str 传递的数组长度。
    stream-- 这是指向 FILE 对象的指针,该 FILE 对象标识了要从中读取字符的流。

    功能
    从指定的流 stream 读取一行,并把它存储在str所指向的字符串内。当读取(n-1)个字符时,或者读取到换行符时,或者到达文件末尾时,它会停止,具体视情况而定。

    返回值
    (1)如果成功,该函数返回相同的 str 参数。如果到达文件末尾或者没有读取到任何字符,str 的内容保持不变,并返回一个空指针。
    (2)如果发生错误,返回一个空指针。

    PS:如果文件中的该行,不足n-1个字符,则读完该行就结束。如若该行(包括最后一个换行符)的字符数超过n-1,则fgets只返回一个不完整的行,但是,缓冲区总是以NULL字符结尾,对fgets的下一次调用会继续读该行。函数成功将返回stream,失败或读到文件结尾返回NULL。因此不能直接通过fgets的返回值来判断函数是否是出错而终止的,应该借助feof函数或者ferror函数来判断。

    fputs

    函数原型:
    int fputs(const char *str, FILE *stream);

    参数
    str – 这是一个数组,包含了要写入的以空字符终止的字符序列。
    stream – 这是指向 FILE 对象的指针,该 FILE 对象标识了要被写入字符串的流。

    返回值
    该函数返回一个非负值,如果发生错误则返回 EOF。

    例子:

    #include <stdio.h>
    
    int main ()
    {
       FILE *fp;
    
       fp = fopen("file.txt", "w+");
    
       fputs("这是 C 语言。", fp);
       fputs("这是一种系统程序设计语言。", fp);
    
       fclose(fp);
       
       return(0);
    }
    

    fprintf

    函数声明
    int fprintf (FILE* stream, const char*format, [argument])
    参数
    stream-- 这是指向 FILE 对象的指针,该 FILE 对象标识了流。
    format-- 这是 C 字符串,包含了要被写入到流 stream 中的文本。它可以包含嵌入的 format 标签,format 标签可被随后的附加参数中指定的值替换,并按需求进行格式化。
    format 标签属性是%[flags][width][.precision][length]specifier
    [argument]:附加参数列表 [3]
    功能
    fprintf()函数根据指定的格式(format),向输出流(stream)写入数据(argument)。
    PS
    fprintf( )会根据参数format 字符串来转换并格式化数据,然后将结果输出到参数stream 指定的文件中,直到出现字符串结束(’\0’)为止。

    示例

    #include <cstdio>
    int main()
    {
        FILE* fp;
        int i = 617;
        char* s = "that is a good new";
        fp = fopen("text.dat", "w");
        fputs("total", fp);
        fputs(":", fp);
        fprintf(fp, "%d\n", i);
        fprintf(fp, "%s", s);
        fclose(fp);
        return 0;
    }
    

    代码实现

    下面开始进行代码的具体实现,经过这段时间的编程实践,我越发的认识到一点,当你想要实现一个具体的功能的时候,你有了整体的思路以后,你需要将这个功能的具体实现划分为更为小的一个个部分,然后再一点点的编写实现一个小功能,立马进行测试,成功以后再进行下面的部分
    比如本文将要实现从得到的data文件中将data数据写回wav数据区,我首先需要从data文件中提取出原本的数据放到一个缓存的数组里面,我首先使用fgets函数提取一行数据存到了预先设置好的数组,然后就马上用printf函数打印看看这提取出来的一行数据是否正确,然后再进行下面一个个小功能的实现。一个大项目就是由无数的小功能组成的。人生亦是如此。不积跬步,无以至千里;不积小流,无以成江海。

    遇到的问题

    1、在按照我自己的思路将一行行的数据回写到原本的wav文件后,无法正常打开回写后的wav文件,并且wav文件的体积也比原来大了不少。

    解决思路:首先我要先去检查一下当初从wav文件data区提取的数据是否正确,通过用HxD的二进制查看软件,查看一下原本wav文件的data区,经过对比,提取出的data数据没有问题。
    然后通过wav文件的体积也比原来大了不少发现自己回写数据时用的数据类型是char,但是提取又是用的short。
    我原本的思路,因为只需要把data区数据写回就好,但是我发现用fopen函数以写入的方式打开文件以后,不对wav文件进行操作,原本的wav文件的原始数据会被修改掉。

    没有意义,我决定先去写wav的采样率修改的程序

    没有必要实现的原因

    因为其实从采样位数转换里面就看出,直接采取缓存数组的方式处理数据就可以了,但是如果数据量很大的话,那就需要别的办法了。幸好本毕设软件只需要做出一个wav参数处理的示例就好。

    展开全文
  • 目录wav文件采样位数修改程序实现问题解决程序结果 wav文件采样位数修改 本文是在前一篇文章的基础上,将已经完成的有关16位采样转化为8位采样的程序加入自己的毕设程序当中。在前一篇文章的基础上,接下来的工作就...

    wav文件采样位数修改

    本文是在前一篇文章的基础上,将已经完成的有关16位采样转化为8位采样的程序加入自己的毕设程序当中。在前一篇文章的基础上,接下来的工作就很简单了,首先在头文件中添加好需要加入的功能函数声明,再新建一个函数文件将函数定义写好就可以了。下面开始编程的代码实现:

    程序实现

    由于需要改变wav文件的采样位数,需要提前知道源wav文件的有关参数,故此先用以前写好的分析wav文件的程序提前得到源wav文件的参数如下:
    在这里插入图片描述
    从上图可以知道,采样位数是16位,采样位数变为8位以后,首先采样帧大小会变为1字节;然后比特率也会变为原来的一半,为44100bit/s;数据区大小也会变为原来的一半;最后ChunkSize也会变化,ChunkSize=数据区大小+36。故此新的wav文件创建后,写入的头文件需要修改上面的四个参数:采样位数,采样帧大小,比特率,数据区大小,ChunkSize。

    问题解决

    前一篇文章已经讲述过16位采样数据存入8位wav文件的过程,在此不再赘述。现在我想解决一下前一篇文章中留下的问题,即是每个除去高位得到的8位采样数据,有没有必要加128。

    解决过程:
    首先我尝试了加了128的程序,程序运行后成功,修改得到的wav文件可以听到与源文件相同的声音,写入8为wav文件的采样数据有几个样值:126,127,128,129。
    不加128后,得到了非常大的噪音的wav输出文件。
    由于定义时data_8和mdata_8分别是有符号和无符号的数据类型,我现在将其全部修改为无符号再测试。还是一样,测试中,我加入了一条输出语句,观察写入8位wav文件的采样数据有几个样值:0,1,254和255,差距很大。
    于是在上面的基础上,我又加回128进行测试,输出wav文件声音正常,样值变化为和开始一样,但是为什么原来有些255的样值加了128反而变小了,那证明原来有些255的样值是负数???。
    %d是有符号的十进制数据输出啊。
    我将data_8和mdata_8改为了有符号的类型测试。不加128,样值多为-1,-2和0,得到的wav文件有很大噪音。加128后样值多为128,128,-127,-128,得到的wav文件声音正常。
    再修改为初始的有符号和无符号的数据类型,样值与前没有变化,声音也没有变化。结论1:mdata_8有无符号型只是对输出的数据有没有正负号有影响,加不加都可以。
    但是到底为什么要加128还是不清楚,不加的话,样值多为-1,-2,0,得到的声音噪音很大,加了128以后,0变成了-128???

    结论2:暂时到此为止,加了128消除了很大噪音,暂时理解为一种降噪声的算法。

    程序结果

    下面给出最终转换好的,8位wav文件的参数:
    在这里插入图片描述
    关于8位转16位考虑:因为8位采样数据原本就没有16位采样数据多,不可能无中生有,所以不考虑。

    PS:经过测试16位的双声道wav文件此程序同样适用。

    代码:
    百度云:https://pan.baidu.com/s/1eNu2hMkaJqViGJJ_SY3NBQ
    提取码:241c

    展开全文
  • linux sox命令批量修改wav文件采样率,音量等
    #!/bin/bash
    for file in *.wav; do
    	#echo $file
    	c=${file}
    	#echo $c
    	sox -v 0.9 $c -r 16000 -b 16 -c 1 new_$c
    	rm -rf $c
    	mv new_$c $c
    done

    展开全文
  • wav文件的采样频率修改(C实现)

    千次阅读 2020-04-25 18:44:30
    例如:一个wav文件的采样频率是44100Hz,说明本文件每一秒钟采集了44100个数据点。然后每个数据点又与采样位数有关,比如当我们的采样位数是16位,则每个数据点的取值范围就是-32768~32767。当然,一个文件采样频率...
  • wav文件降采样

    千次阅读 2019-06-26 22:33:50
    一、librosa ...def wav_file_resample(src, dst, dst_sample): """ 对目标文件进行降采样采样率为dst_sample :param src:源文件路径 :param dst:降采样后文件保存路径 :param dst_sample...
  • Linux下用sox修改wav文件的采样

    万次阅读 2016-05-26 14:01:01
    1,将2.wav文件的采样修改为16000HZ 命令如下:sox 2.wav -r 16000
  • wav 模块中 ,主要介绍一种方法:getparams(),该方法返回的结果如下: _wave_params(nchannels=1, sampwidth=2, framerate=48000, nframes=171698592, comptype='NONE', compname='not compressed') 参数解释: ...
  • #!/bin/bash for file in *.wav; do #echo $file c=${file} #echo $c sox -v 0.9 $c -r 16000 -b 16 -c 1 new_$c rm -rf $c mv new_$c $c done
  • 问题描述:对WAV波形音乐进行重新采样,并生产新文件。思考一下,然后到文末查看参考代码:1)我们是如何听到声音的?2)采样频率对听觉效果有什么影响?3)Python有什么库可以用来操作WA...
  • 可以将wav或pcm音频文件,采样频率和通道数进行转换,如将44100kHz采集率转换成16000kHz,单声道转换成双声道。代码和库完整,直接可以运行。
  • 语音识别:对音频wav进行频率重采样 import librosa import soundfile as sf for i in range(1,101): #name = "LJ001-"+str( "%04d"%(i) )+".wav" name = "" src_sig,sr = sf.read(name) #name是要 输入的wav 返回...
  • 最近系统上需要增加一个功能,就是测试我们系统的ASR识别引擎,这就需要上传一段音频,然后我们返回识别后的文字,但是我们的识别引擎需要采样率16k,格式为wav的音频文件,但是我们又不能限定用户上传的录音格式,...
  • python wav的重采样(降成16000hz)

    千次阅读 2020-02-14 15:08:55
    ` import librosa import soundfile as sf for i in range(1,101): #name = "LJ001-"+str( "%04d"%(i) )+".wav" ... src_sig,sr = sf.read(name) #name是要 输入的wav 返回 src_sig:音频数据 sr:原采样频率 ...
  • 直接用sox工具可以将给单个pcm文件加头,如:1.wav是不带wav头的pcm文件 $ sox -t raw -c 1 -e signed-integer -b 16 -r 16000 1.wav test.wav $ soxi test.wav  可得 Input File : 'test.wav' Channels : 1 ...
  • 最近开始做实验需要绘制音频的语谱图,绘制语谱图的过程中需要FFT过程,FFT需要采样点个数是2的整数倍,所以为了生成语谱图的大小合适,那么总长65536是个比较合适的数,对于采样率32kHz的wav音频,2S时常正好是...
  • 这种方法可以将语音进行重采样。声频信息完整。但不是pcm格式,可能需要使用第3步进行格式转化。 filename = 'wav_file_8.wav' newFilename = 'wav_file_16.wav' y, sr = librosa.load(filename, sr=8000) y_16 = ...
  • } 音频解析方法调用: public static void main(String[] args) throws IOException { File f = new File("E:/zmj-3011-32779/audio.wav"); RandomAccessFile rdf = null; rdf = new RandomAccessFile(f,"r"); ...
  • 修改音频采样率和单双通道

    千次阅读 2020-05-30 16:43:17
    需要修改音频的分辨率,单双通道属性,但是从网上找了很多命令都有这样那样的问题,这里我用格式化工厂很好的解决了问题。 步骤 安装格式化工厂 pass 运行格式化工厂 3.选择音频处理,这里我需要保存成wav格式 4...
  • 修改采样率 sox 8k_16bit.wav -r 16000 16k_16bit.wav 修改量化精度 sox 16k_16bit.wav -b 8 16k_8bit.wav sox 2.wav -r 16000 -b 8 8k_8bit1.wav sox命令链接
  • WAV MP3 Converter 可将WAV转成MP3和将MP3转成WAV, 并重采样WAV和MP3文件. 这是一个一体化音频转换器,支持超过150种音频和视频文件, 并能在转换时保留ID3标签. 该软件完全兼容 Vista 和 Windows 7. 您可以更改目标...
  • 截取音频: ffmpeg -i input.wav -ss 00:00:05 -t 00:00:10 output.wav -ss为开始时间 -t为持续时间 查看音频格式: ffprobe input.wav 修改音频文件采样率: ffmpeg -i input.wav -ar 16000 output.wav
  • 批量修改音频采样

    2020-11-06 13:30:06
    import librosa import os 安装librosa0.7.2版本,numba0.48.0要不然可能会报错 l = os.listdir(‘C:\Users\v_kuivzhang\Desktop\新建文件夹’) for i in l: ...# 需要修改采样率 y_16 = librosa.resample.

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,215
精华内容 1,686
关键字:

wav采样修改