精华内容
下载资源
问答
  • 1. 读取WAV声音文件

    千次阅读 2012-11-18 09:05:36
    1. 读取WAV声音文件 [plain] view plaincopy % wavread(filename) 读取一个WAVE文件,并返回采样数据到向量y中,Fs表示采样频率, bits表示采样位数 [y, Fs, bits] = wavread('drum.wav');   %假设...
    1. 读取WAV声音文件
    [plain] view plaincopy
    % wavread(filename) 读取一个WAVE文件,并返回采样数据到向量y中,Fs表示采样频率, bits表示采样位数  
    [y, Fs, bits] = wavread('drum.wav');  
     
    %假设声音文件有两个声道,我们只分析第一个声道,如果要分析第二个声道可以改为:ft=y(:,2);  
    ft = y(:,1);  
    sigLength = length(ft); %获取声音长度  
     
    %可以使用sound函数来播放声音  
    sound(y, Fs, bits)  

    >> left = y(:,1);
    >> leftSigLength = length(left)

    leftSigLength =

          106764

    >> sound(y, Fs, bits)
    >> ydown10=y./10;
    >> sound(ydown10, Fs, bits)
    >> yup10=y.*10;
    >> sound(yup10, Fs, bits)
    >> sound(ydown10, Fs, bits)
    >> sound(y, Fs, bits)
    >> sound(yup10, Fs, bits)
    >> sound(y, Fs, bits)
    >> sound(ydown10, Fs, bits)
    >> yleftHirightLow=[yup10(:,1);ydown10(:,1)];
    >> yleftHirightLow=[yup10(:,1),ydown10(:,1)];
    >> sound(yleftHirightLow, Fs, bits)
    >> sound(yleftHirightLow, Fs, bits)
    >> yleftLowrightHi=[ydown10(:,1),yup10(:,1)];
    >> sound(yleftLowrightHi, Fs, bits)
    >>
    >> wavwrite(ydown10,Fs,'ydown10.wav');
    >> wavwrite(yup10,Fs,'yup10.wav');
    Warning: Data clipped during write to file:yup10.wav
    > In wavwrite>PCM_Quantize at 248
      In wavwrite>write_wavedat at 272
      In wavwrite at 114
    >> wavwrite(yleftHirightLow,Fs,'yleftHirightLow.wav');
    Warning: Data clipped during write to file:yleftHirightLow.wav
    > In wavwrite>PCM_Quantize at 248
      In wavwrite>write_wavedat at 272
      In wavwrite at 114
    >> wavwrite(yleftLowrightHi,Fs,'yleftLowrightHi.wav');
    Warning: Data clipped during write to file:yleftLowrightHi.wav
    > In wavwrite>PCM_Quantize at 248
      In wavwrite>write_wavedat at 272
      In wavwrite at 114
    >>
    展开全文
  • 04H4longint文件长度 08H4char"WAVE"标志 0CH4char"fmt"标志 10H4 过渡字节(不定) 14H2int格式类别(10H为PCM形式的声音数据) 16H2int通道数,单声道为1,双声道为2 18H2int采样率(每秒样本数),表示每个通道的播放...

    00H 4 char "RIFF"标志  04H 4 long int 文件长度  08H 4 char "WAVE"标志  0CH 4 char "fmt"标志  10H 4   过渡字节(不定)  14H 2 int 格式类别(10H为PCM形式的声音数据)  16H 2 int 通道数,单声道为1,双声道为2  18H 2 int 采样率(每秒样本数),表示每个通道的播放速度,  1CH 4 long int 波形音频数据传送速率,其值为通道数×每秒数据位数×每样                本的数据位数/8。播放软件利用此值可以估计缓冲区的大小。  20H 2 int 数据块的调整数(按字节算的),其值为通道数×每样本的数据位            值/8。播放软件需要一次处理多个该值大小的字节数据,以便将其            值用于缓冲区的调整。  22H 2   每样本的数据位数,表示每个声道中各个样本的数据位数。如果有多          个声道,对每个声道而言,样本大小都一样。  24H 4 char 数据标记符"data"  28H 4 long int 语音数据的长度

    楼主的帖子,文件头长度加起来是42字节,但是实际长度是44个字节(用UltraEdit打开一个WAVE文件,数一下就知道了)。如果用以个结构体来定义WAVE文件头应该为: struct WAVEFILEHEADER {  char chRIFF[4];  DWORD dwRIFFLen;  char chWAVE[4];  char chFMT[4];  DWORD dwFMTLen;  PCMWAVEFORMAT pwf;  char chDATA[4];  DWORD dwDATALen; };

    但是实际测试,并不是所有的wave文件头都一样。比较麻烦的就是windows下自带的那个录音机录下的wav,文件头有58个Byte。所以,比较好的办法是,首先读取n长的一段字符,例如60个;然后从中查找关键字“data”,“data”之后的一个DWORD是实际音频数据的长度,得到这个长度len,再从这DWORD后开始读取len个字节,就可以读到文件尾。如果是双声道的,那么数据是交替存放的;如果是16bit采样的,每两个字节会以小端的方式存储一个AD值。根据这样的方式,就可以顺利读取音频数据了。

    有一个问题就是:在不知道文件头多长的情况下,采用直接读取60个Byte的方法是不够严谨的。如果是标准的wav格式,那么文件头只有44byte,就存在整个文件都没有60Byte长的可能性。实际中当然不大可能,但是严谨考虑,应该先读取36个Byte,从37开始,4个4个的读取,判断是否有“data”关键字,进而得出文件头的实际长度。

    就想到了这些,暂时记下来。

    展开全文
  • 在计算之前,我们要知道一下wav文件中的三个参数 采样频率、音频通道数、每次采样得到的样本位数 ,这三个参数用来表示声音,同时决定了wav文件的音质,大小。下面简单介绍一下这三个参数。采样频率 指每秒钟取得...

    简述

    Qt 之 WAV文件解析 中给出了WAV文件属性的计算,具体包括文件大小、音频时长、比特率等属性,这里我们再次验证一下这些属性值的计算 。

    在计算之前,我们要知道一下wav文件中的三个参数 采样频率、音频通道数、每次采样得到的样本位数 ,这三个参数用来表示声音,同时决定了wav文件的音质,大小。下面简单介绍一下这三个参数。

    采样频率

    指每秒钟取得声音样本的次数。采样的过程就是抽取某点的频率值,很显然,在一秒中内抽取的点越多,获取得频率信息更丰富,为了复原波形,采样频率越高,声音的质量也就越好,声音的还原也就越真实,但同时它占的资源比较多。由于人耳的分辨率很有限,太高的频率并不能分辨出来。22050 的采样频率是常用的,44100已是CD音质,超过48000或96000的采样对人耳已经没有意义。

    音频通道数

    声音的通道的数目。常见的单声道和立体声(双声道),现在发展到了四声环绕(四声道)和5.1声道。如果是双声道,采样就是双份的,文件也差不多要大一倍。

    每次采样得到的样本位数

    采样位数可以理解为声卡处理声音的解析度。这个数值越大,解析度就越高,录制和回放的声音就越真实。 采样位数也叫采样大小或量化位数。它是用来衡量声音波动变化的一个参数,也就是声卡的分辨率或可以理解为声卡处理声音的解析度。它的数值越大,分辨率也就越高,录制和回放的声音就越真实。


    计算公式

    波形数据传输速率(每秒平均字节数) = 采样频率 × 音频通道数 × 每次采样得到的样本位数 / 8

    比特率(kbs) = 波形数据传输速率 × 8 / 1000

    WAV文件所占大小(字节) = 波形数据传输速率 × 音频文件时长

    音频文件时长(秒) = WAV文件所占容量 / 波形数据传输速率

    关于以上几个属性我们可以右击wav文件查看文件属性看到这几个值。见下图。

    这里写图片描述这里写图片描述

    从上述两幅图中我们可以知道这个wav文件的总大小为6947字节比特率为88kbs时间为0s,是不是很诧异,为什么这里时间为0呢?实际上windows这里只是按整数显示音频时长,那么真正的时间怎么计算呢?

    这里我们已经知道了wav文件的大小,看上述公式,我们还要知道波形数据传输速率波形数据传输速率而又是由采样频率 、 音频通道数 、 每次采样得到的样本位数 来决定,那么这些参数怎么获取到呢?

    看过Qt 之 解析wav文件的头信息(详细分析、对比不同wav文件的数据)这篇文章就应该知道如何去解析一个wav文件,并获取所有的文件头信息,如果不知道文件头信息是什么,请参考Qt 之 WAV文件解析

    好了,既然对于一个wav文件,我们能够获取到所有的头信息,那么接下来就来验证以上公式计算的结果。

    这里写图片描述

    上图为wav文件的头信息数据,我们可以看到波形数据传输速率nBytesPerSecond)的值为11025,文件总大小为6947字节,音频数据大小为6903字节,文件头信息为44字节。

    音频文件时长(秒) = WAV文件所占容量 / 波形数据传输速率 = 6903 / 11025 = 0.626122 s

    比特率(kbs) = 波形数据传输速率 × 8 / 1000 = 11025 × 8 / 1000 = 88 kbs

    这里为什么精确到小数点后六位,其实也是为了与程序记录的时间做对比,这里也要特别注意:实际上 WAV文件所占容量 为 WAV文件中 音频数据大小 ,而并非WAV文件总大小 , 但是 文件头信息所占字节非常小,所以就算是将这块大小加上进行计算,对最后的计算结果影响也非常小。下面我们就用QAudioOutput 来播放这个wav文件,同时记录播放时间 。

    代码之路

    // 播放wav文件
    void MyAudioInput::onPlay()
    {
        sourceFile.setFileName(WAV_RECORD_FILENAME);
        sourceFile.open(QIODevice::ReadOnly);
    
        // 设置播放音频格式;
        QAudioFormat format;
        format.setSampleRate(11025);
        format.setChannelCount(1);
        format.setSampleSize(8);
        format.setCodec("audio/pcm");
        // wav文件即按照这个字节存储顺序保存数据;
        format.setByteOrder(QAudioFormat::LittleEndian);
        format.setSampleType(QAudioFormat::UnSignedInt);
    
        QAudioDeviceInfo info(QAudioDeviceInfo::defaultOutputDevice());
        //qDebug() << info.supportedCodecs();
        if (!info.isFormatSupported(format))
        {
            qWarning() << "Raw audio format not supported by backend, cannot play audio.";
            return;
        }
    
        m_audioOutput = new QAudioOutput(format, this);
        connect(m_audioOutput, SIGNAL(stateChanged(QAudio::State)), this, SLOT(handleStateChanged(QAudio::State)));
        m_audioOutput->start(&sourceFile);
        m_time.start();
    }
    
    // 播放状态更新;
    void MyAudioInput::handleStateChanged(QAudio::State state)
    {
        switch (state) {
        case QAudio::IdleState:
            // Finished playing (no more data)
            qDebug() << "elapsedUSecs:" << m_audioOutput->elapsedUSecs();
            qDebug() << "time : " << m_time.elapsed();
            onStopPlay();
            break;
    
        case QAudio::StoppedState:
            // Stopped for other reasons
            if (m_audioOutput->error() != QAudio::NoError) {
                // Error handling
            }
            break;
    
        default:
            break;
        }
    }
    // 关闭播放;
    void MyAudioInput::onStopPlay()
    {
        if (m_audioOutput != NULL)
        {
            m_audioOutput->stop();
            sourceFile.close();
            delete m_audioOutput;
            m_audioOutput = NULL;
        }
    }
    

    代码中我分别用了QAudioOutput类的elapsedUSecs方法和QTime类的elapsed方法来记录wav文件音频时长。以下是两个方法的介绍。
    这里写图片描述

    这里写图片描述
    elapsedUSecs() 输出为微妙
    elapsed() 输出为毫秒

    通过记录得到以下数据:

    m_audioOutput->elapsedUSecs() : 636000
    m_time.elapsed() : 635

    m_audioOutput->elapsedUSecs() : 639000
    m_time.elapsed() : 638

    m_audioOutput->elapsedUSecs() : 642000
    m_time.elapsed() : 641

    m_audioOutput->elapsedUSecs() : 639000
    m_time.elapsed() : 639

    而我们的计算结果为: 0.626122 s = 626.122 ms = 626122 us , 显然程序中获取的时间大于计算的时间,这也很好理解,因为程序的运行需要消耗一定的时间,所以记录的时间存在很小的误差(误差范围大致在0.009s ~ 0.016s),如果电脑性能更好这个误差就越小。

    特别注意

    这里我们用QAudioOutput类来计算wav文件时长,这里我们要给QAudioOutput类对象设置播放格式QAudioFormat ,设置的格式必须与解析出来的文件头信息中的 采样频率、音频通道数、每次采样得到的样本位数、编码格式等严格保持一致,否则不仅播放出来的声音不清楚,记录的音频时长也有问题


    通过以上发现,我们的计算公式是成立的。基本上我们可以在wav文件头信息中获取wav文件的全部信息,唯一就是wav**文件时长**需要通过文件头中的信息进行计算得到。所以如果我们想要做一个播放器,在播放器上显示一个wav文件的时长,我们就需要先解析wav文件的头信息,通过计算得到文件时长。

    更多参考

    Qt 之 WAV文件解析

    Qt之实现录音播放及raw(pcm)转wav格式

    Qt 之 解析wav文件的头信息(详细分析、对比不同wav文件的数据)

    展开全文
  • !...我要画WAV波型图,可是这个WAV文件头算出来的...只有两位,怎么表示声音强度?我是用PlaySound来播放的,打开OD调试发现它直接将这个文件的数据复制到内存的某个地址,然后就播放 ,好像没做什么解压处理之类的操作,真搞不懂
  • MATLAB 声音文件处理

    2019-10-06 05:47:30
    由于最近的Project要做声音分析,需要用到MATLAB,之前一直没怎么接触过,所以乘着做Project学习下。...1. 读取WAV声音文件 % wavread(filename) 读取一个WAVE文件,并返回采样数据到向量y中,Fs表示采样...

    由于最近的Project要做声音分析,需要用到MATLAB,之前一直没怎么接触过,所以乘着做Project学习下。真的用了才知道MATLAB真是神器啊,呵呵~~~其强大的函数库和数学运算能力彻底让我折服了。言归正传,我们来讨论下用MATLAB做声音文件处理。

    1. 读取WAV声音文件

    % wavread(filename) 读取一个WAVE文件,并返回采样数据到向量y中,Fs表示采样频率, bits表示采样位数 [y, Fs, bits] = wavread('drum.wav'); %假设声音文件有两个声道,我们只分析第一个声道,如果要分析第二个声道可以改为:ft=y(:,2); ft = y(:,1); sigLength = length(ft); %获取声音长度 %可以使用sound函数来播放声音 sound(y, Fs, bits)
    2. 绘制波形图
    t=(0:sigLength-1)/Fs; figure; subplot(2,1,1); plot(t, ft), title('Plot of the Tone'),grid; xlabel('Time(s)'); ylabel('Amplitude');

    3. 绘制振幅频谱图
    %Y = fft(X) 使用快速傅里叶变换算法返回向量X的离散型傅里叶变换 %Y = fft(X,n) 返回n点的离散傅里叶变换,如果向量X的长度小于n,函数要将向量X补零到长度n;如果向量X的长度大于n, 则函数阶段X使之长度为n。若X是矩阵,按相同方法对X进行处理。 Y = fft(ft,sigLength); halfLength = floor(sigLength/2); Pyy =Y(1:halfLength + 1); % 只选取前半截部分
     
    波形的傅里叶变换返回震级和相位信息,并且用复数的形式表达,通过计算绝对值来获取其频率的振幅
    Pyy = abs(Pyy);%用于计算复向量的Y的振幅 f = ((0:halfLength)+1)* Fs/sigLength; subplot(2,1,2); plot(f,Pyy), title('Frequency spectrum'),grid; xlabel('Frequency(Hz)'); ylabel('Amplitude');
     
    4. 绘制能量频谱图
    Y = fft(ft,sigLength); halfLength = floor(sigLength/2); Pyy =Y(1:halfLength + 1); % 只选取前半截部分 Pyy = abs(Pyy);%用于计算复向量的Y的振幅 f = ((0:halfLength)+1)* Fs/sigLength; %通过点数调整比例,从而使振幅不依赖于信号长度或采样频率,说实话这部分还不是很明白 Pyy = Pyy/sigLength; Pyy = Pyy.^2; %求平方得到能量 % 乘以2, 请参照 http://www.mathworks.com/support/tech-notes/1700/1702.html if rem(sigLength, 2) %奇数的 n fft 不包含奈奎斯特(Nyquist)点 Pyy(2:end) = Pyy(2:end)*2; else Pyy(2:end -1) = Pyy(2:end-1)*2; end plot(f/1000, 10*log10(Pyy), 'k') xlabel('Frequency (kHz)') ylabel('Power (dB)')
     
    引用:
    The MethWorks Support. Technique notes 1702, http://www.mathworks.com/support/tech-notes/1700/1702.html

    转载于:https://www.cnblogs.com/wubo/archive/2011/08/02/2253507.html

    展开全文
  • WAV为微软公司(Microsoft)开发的一种声音文件格式,它符合RIFF(Resource Interchange File Format)文件规范,用于保存Windows平台的音频信息资源。 通常使用三个参数来表示声音,量化位数,取样频率和采样点振幅。...
  • python实现简单的声音文件读写

    千次阅读 2019-07-17 15:23:35
    声音文件的读取 以下以wav文件为例。 使用wave模块进行声音的读取操作是:wave.open(r"wav文件路径",“rb") ‘rb‘表示命令为只读模式。 wav.open命令后将返回一个wave_read对象,通过调用wave_read的方法可以获取...
  • 对于matlab,大家应该比较熟悉。今天小哥就带大家来做均匀量化。量化是将模拟信号转化为数字信号必不可少的一步。均匀量化相对比较简单,...具体一点:在road.wav文件左声道取前200个点做4bit量化,并且用matlab作...
  • WAV可以使用多种音频编码来压缩其音频流,不过我们常见的都是音频流被PCM编码处理的WAV,但这不表示WAV只能使用PCM编码,MP3编码同样也可以运用在WAV中,和AVI一样,只要安装好了相应的Decode,就可以欣赏这些WAV了...
  • PCM录音就是将声音的模拟信号表示成0,1标识的数字信号,未经任何编码和压缩处理,所以可以认为PCM是未经压缩的音频原始格式。PCM格式文件中不包含头部信息,播放器无法知道采样率,声道数,采样位数,音频
  • PCM和WAV数据结构详解

    2019-08-25 20:53:04
    PCM和WAV是我们常用的两种音频数据格式: 一般包含以下几大要素: 采样率 在我的另一篇博文 音频编码 中已经介绍了采样和量化的概念,这里介绍一下采样率。 采样率表示音频信号每秒的数字快照数。该速率决定了...
  • 音频格式简介和PCM转换成WAV

    万次阅读 2019-01-15 15:30:29
    PCM(Puls Code Modulation)全称脉码调制录音,PCM录音就是将声音的模拟信号表示成0,1标识的数字信号,未经任何编码和压缩处理,所以可以认为PCM是未经压缩的音频原始格式。PCM格式文件中不包含头部信息,播放器...
  • 0 音频编解码基础 采样率:声音信号在“模数转换”过程中单位时间内采样的次数。 采样值:每一次采样周期内声音模拟信号的积分值。...单声道:11.025 KHz 采样值,...1 WAV音频文件格式 见下图: 文件
  • C#添加声音

    2009-08-30 20:33:00
    添加一个引用:Using System.Media.SoundPlayer; SoundPlayer sp=new SoundPlayer("d://aa.wav");//表示添加声音文件的路径sp.play();
  • PCM文件格式简介

    2012-10-18 09:45:22
    PCM文件:模拟音频信号经模数转换(A/D变换)直接形成的二进制序列,该文件没有附加的文件头和文件结束标志。...要将这样的信号转为 PCM 格式的方法,是使用三个参数来表示声音,它们是:声道数、采样位数和采样频率。
  • WAVE 文件格式

    2010-12-22 14:08:00
    time: 2010-12-7 13:43:29WAVE 文件格式简介 WAV文件格式的应用是非常广泛的。 这里首先值得一提的是,... Wave文件使用三个参数来表示声音 ,它们是:声道数、采样位数和采样频率。 采样位数:即采样值或取样值(就
  • PlaySound

    2019-05-10 00:25:03
    Bool PlaySound(LPCTSTR pszSound,//播放声音文件地址,NULL表示停止,想要只写文件名.wav就把wav和cpp放一起 HMODULE hmod,//声音文件的句柄 DWORD fdwSound);//控制声音播放 需要连接winmm.lib 方法是 #pragma ...
  • Sound-Similar-Free-Setup.exe

    2019-08-09 00:46:21
    Sound-Similar (免费版)是一个轻巧的工具软件,可用于测量两个具有线性PCM格式的WAV声音文件在听觉上的相似度。这种格式是WAV文件中最常见的。相似度以百分比0%~100%来表示。它不是通过对两个数字文件进行一个字节一...
  • 基础知识

    2019-09-16 20:38:20
    WAV文件使用三个参数表示声音: 采样位数:8bit(256)和16bit(65536)两种如果采样时将声音信号强弱分为 256 级, 就是我们说的 8bit 采样, 采样频率:11025Hz(11KHz)-语音、22050Hz(2...
  • python利用pyaudio写一个录音小程序

    千次阅读 2019-06-13 22:19:40
    python利用pyaudio实现录音并...通常使用三个参数来表示声音,量化位数,取样频率和声道数。 量化位数分为8位,16位,24位三种,声道有单声道和立体声之分,单声道振幅数据为n*1矩阵点,立体声为n*2矩阵点,取样...
  • 易混淆媒体:(表示媒体,表现媒体) 表示媒体,如:图像编码,...声音WAV,MP3,ReadAudio,Sound,Voice,MIDI 图像:BMP,GIF,TIFF,PCX,PNG,JPEG,WMF 视频:MOV,mp4,ReadVideo,dat,AVI,Flic ...
  • 一、ffmpeg将wav文件转换为pcm音频 ffmpeg -i middle_tone.wav -f s16le -ar 16000 -ac 1 -acodec pcm_s16le middle_tone.pcm 参数解释: ...-ac 设定声音的Channel数 (1表示单声道) -acod...
  • 1. VoIP  2. J2ME  3. IPv6  ...1. 请给出至少两种常用于计算机和数码设备中表示声音文件结构的名称或后缀名?阐述各有什么主要特点?其中声音数据的编码方式? WAV;优点包括:简单的编
  • 2、下列声音文件格式中,(B)不是波形文件格式。 A.WAV B.MP3 C.RA D.MID 3、MPEG图像形式中压缩率最大的图像帧为(C)。 A.I帧图像 B.P帧图像 C.B帧图像 D.直流分量图 4、下列文件格式中,(B)是非...
  • 音频格式详解

    2010-06-30 20:44:00
    经典的WAV、WAVE文件作为最经典的Windows多媒体音频格式,应用非常广泛,它使用三个参数来表示声音:采样位数、采样频率和声道数。 声道有单声道和立体声之分,采样频率一般有11025Hz(11kHz)、22050Hz(22kHz)和...
  • 2.导入与导出 WAV、MP3、Ogg Vorbis或者其他的声音文件格式 3.支持MP4、MOV、WMA、M4A 、AC3档。 4.录音与放音 5.对声音做剪切、复制、粘贴(可撤消无限次数) 6.多音轨混音 7.数字效果与插件 8.波封编辑 ...
  • HTML5新媒体元素

    2017-06-29 18:07:00
    新媒体元素 audio 示例 //controls表示向用户显示控件<audio controls> <source src="house.mp3"&...定义音频(声音) ...支持三种文件格式:MP3、Wav、Ogg 浏览器支持 IE MP3 ...
  • VR厂商 与虚拟角色交谈以进行VR应用内购买! 这是我2017 AWS Chatbot Competition的github页面。 该项目将Lex与游戏引擎Unreal Engine 4和Amazon ...” 可能会产生一个输出“ good.wav”来播放声音文件。 设定说明 这
  • 现在,我需要对输入进行去噪,以Numpy数组表示(像大多数教程和SO上的文章一样,没有.wav文件!)。 它对我不起作用。我的main.py:from copy import copyimport numpy as npimport pyaudio as paim...

空空如也

空空如也

1 2 3
收藏数 44
精华内容 17
关键字:

wav表示声音文件