精华内容
下载资源
问答
  • 关于wavread函数的用法

    千次阅读 2021-04-22 08:31:02
    在pr9_3_1 程序中,注明的是使用wavread函数读入一帧语音信号,那么读入的是哪一帧数据,能够选择读入数据的帧数吗?程序代码如下clear all; clc; close all;fle='C:\Users\lenovo\Desktop\snn27.wav'; % 指定文件名...

    在pr9_3_1 程序中,注明的是使用wavread函数读入一帧语音信号,那么读入的是哪一帧数据,能够选择读入数据的帧数吗?

    程序代码如下

    clear all; clc; close all;

    fle='C:\Users\lenovo\Desktop\snn27.wav';                            % 指定文件名

    [x,fs]=wavread(fle);                        % 读入一帧语音信号

    u=filter([1 -.99],1,x);                     % 预加重

    wlen=length(u);                             % 帧长

    p=12;                                       % LPC阶数

    a=lpc(u,p);                                 % 求出LPC系数

    U=lpcar2pf(a,255);                          % 由LPC系数求出频谱曲线

    freq=(0:256)*fs/512;                        % 频率刻度

    df=fs/512;                                  % 频率分辨率

    U_log=10*log10(U);                          % 功率谱分贝值

    subplot 211; plot(u,'k');                   % 作图

    axis([0 wlen -0.5 0.5]);

    title('预加重波形');

    xlabel('样点数'); ylabel('幅值')

    subplot 212; plot(freq,U,'k');

    title('声道传递函数功率谱曲线');

    xlabel('频率/Hz'); ylabel('幅值');

    [Loc,Val]=findpeaks(U);                     % 在U中寻找峰值

    ll=length(Loc);                             % 有几个峰值

    for k=1 : ll

    m=Loc(k);                               % 设置m-1,m和m+1

    m1=m-1; m2=m+1;

    p=Val(k);                               % 设置P(m-1),P(m)和P(m+1)

    p1=U(m1); p2=U(m2);

    aa=(p1+p2)/2-p;                         % 按式(9-3-4)计算

    bb=(p2-p1)/2;

    cc=p;

    dm=-bb/2/aa;                            % 按式(9-3-6)计算

    pp=-bb*bb/4/aa+cc;                      % 按式(9-3-8)计算

    m_new=m+dm;

    bf=-sqrt(bb*bb-4*aa*(cc-pp/2))/aa;      % 按式(9-3-13)计算

    F(k)=(m_new-1)*df;                      % 按式(9-3-7)计算

    Bw(k)=bf*df;                            % 按式(9-3-14)计算

    line([F(k) F(k)],[0 pp],'color','k','linestyle','-.');

    end

    fprintf('F =%5.2f   %5.2f   %5.2f   %5.2f\n',F)

    fprintf('Bw=%5.2f   %5.2f   %5.2f   %5.2f\n',Bw)

    展开全文
  • 【wav音频解析】之wavread函数的C++实现 摘要: 最近我在用C++写音频处理相关的功能实现,在此过程中有一些体会,总结出来供日后回顾,同时与大家分享,接受批评指正。C++实现wav音频文件的解析,就是先读取原始采样...

    摘要: 最近我在用C++写音频处理相关的功能实现,在此过程中有一些体会,总结出来供日后回顾,同时与大家分享,接受批评指正。C++实现wav音频文件的解析,就是先读取原始采样数据,每次读16字节,然后将16字节的16进制数字转化成十进制数,再转换成其补码,并归一化。转换时注意大小端和符号问题。

    本文由三部分组成,第一部分背景介绍 —— 音频类型及本文动机,第二部分类比matlab下wavread()函数的作用,第三部分则给出该函数的C++实现。

    一 背景介绍
    1.1 本文动机
    1)所有wav音频处理的基础就是将wav格式的文件解析出来,解析成数组才能供我们去做后续的处理(fft等等)。

    2)在matlab中直接有一个很好用的函数wavread(’ test.wav’),输入是wav音频,输出是数组,如第二章所述。

    3)一般的C++函数读取出来的数据,格式如1.2节所述,然而不管是什么格式,数据之间是可互相转换的。

    4)我在解决问题的过程中,没有发现一篇详细的参考文献。

    鉴于此,本文将介绍如何用C++完全实现matlab的wavread函数,输出数据格式一模一样,在这个过程中,大家也可以领略文件中数据的本质,及相互间的转换关系。

    1.2 音频类型
    RIFF全称为资源互换文件格式(ResourcesInterchange FileFormat),RIFF文件是windows环境下大部分多媒体文件遵循的一种文件结构,RIFF文件所包含的数据类型由该文件的扩展名来标识,能以RIFF文件存储的数据包括:音频视频交错格式数据(.AVI) 波形格式数据(.WAV) 位图格式数据(.RDI) MIDI格式数据(.RMI)调色板格式(.PAL)多媒体电影(.RMN)动画光标(.ANI)其它RIFF文件(.BND)。

    Chunk是组成RIFF文件的基本单元,它的基本结构如下:

    struct chunk{
      u32 id; //由4个ASCII字符组成,用以识别块中所包含的数据。如:'RIFF','LIST','fmt','data','WAV','AVI'等
      u32 size;    //块大小,是存储在data域中数据的长度,id与size域的大小则不包括在该值内
      u8 dat[size];   //块内容,数据以字(WORD)为单位排列,如果该数据结构长度是奇数,则最后添一个NULL字节
    };
    

    1.3 wav音频文件
    WAVE 文件作为多媒体中使用的声音波形文件格式之一,它是以RIFF(Resource Interchange File Format)格式为标准的。每个WAVE文件的头四个字节便是“RIFF”。同样的,WAVE 文件由文件头和数据体两大部分组成。其中文件头又分为 RIFF/WAV 文件标识段和声音数据格式说明段两部分。WAVE文件各部分内容及格式见后文。

    常见的声音文件主要有两种,分别对应于单声道(11.025KHz 采样率、8Bit 的采样值)和双声道(44.1KHz 采样率、16Bit 的采样值)。采样率是指:声音信号在“模数”转换过程中单位时间内采样的次数。采样值是指每一次采样周期内声音模拟信号的积分值。

    对于单声道声音文件,采样数据为八位的短整数(short int 00H-FFH);而对于双声道立体声声音文件,每次采样数据为一个16位的整数(int),高八位和低八位分别代表左右两个声道。

    WAVE 文件数据块包含以脉冲编码调制(PCM)格式表示的样本。WAVE 文件是由样本组织而成的。在单声道 WAVE 文件中,声道0代表左声道,声道1代表右声道。在多声道WAVE文件中,样本是交替出现的。

    WAVE 文件除了前面一小段文件头对数据组织进行说明之外,Data 块就是声音的原始采样数据,WAVE 文件虽然可以压缩,但一般都使用不压缩的格式。44.1KHz 采样率、16Bit的分辨率、双声道,所以WAVE可以保存音质要求非常高的声音文件,CD 采用的也是这种格式,声音方面的专家或是音乐发烧友们应该非常熟悉。但这种文件的体积也非常大,以 44.1KHz 16bit 双声道的数据为例,一分钟的声音数据量为:41002byte2channel*60s/1024/1024=10.09M 。所以不合适在网上传送。

    下面我们具体地分析 WAVE 文件的格式
    在这里插入图片描述
    以下是对各个字段的详细解说:
    在这里插入图片描述
    对于Data块,根据声道数和采样率的不同情况,布局如下(每列代表8bits):

    1). 8 Bit 单声道:
    在这里插入图片描述
    2). 8 Bit 双声道
    在这里插入图片描述
    3). 16 Bit 单声道:
    在这里插入图片描述
    4). 16 Bit 双声道
    在这里插入图片描述
    下面我们看一个具体的例子,wav音频文件如下:(十六进制的形式)

    52 49 46 46 24 08 00 00 57 41 56 45 
    66 6d 74 20 10 00 00 00 01 00 02 00 
    22 56 00 00 88 58 01 00 04 00 10 00 
    64 61 74 61 00 08 00 00 00 00 00 00 
    24 17 1e 3c 13 3c 14 16 18 34 23 3c 24 11 1a 0d
    

    对应的分析如下图所示:
    在这里插入图片描述
    举例分析数据:形如 ‘FFFF’ 为一个我们需要的完整的数据。如上图中 sample3:3c 和 13是两个数组合在一起是一个我们需要的数, 3c 13,但右端为大端,则应为 3c 13,十六进制数3c按位转换为2进制为0011 1100,同理13按位转换为2进制为0001 0011,则连起来的16bits的二进制数为0011 1100 0001 0011,那么我们可以看到符号位为0,即为正数。
    二 matlab中的wavread( )函数
    1.wavread(‘testwav.wav’ )
    读者试试看输出。例如,取我的一个声音文件’testwav.wav’,输出的最后10个数据为:

     -0.0001 -0.0001 -0.0002 -0.0003 -0.0002 -0.0002  -0.0002  -0.0003  -0.0002  -0.0002
    

    2.wavread(‘testwav.wav’,‘native’)

    读者可以试试看输出。我的'testwav.wav' 输出的最后10个数据为:
     -4  -2  -8  -9  -7  -8  -8  -11  -5  -7
    

    1 和 2 的输出数据之间的转换公式为:-0.0002 = -7 / 32768 (其中32768 = 2 ^15,即2的15次幂。这是归一化。因为编码为16bits)

    三 readwav的 C++实现
    上面介绍了这么多,我们来进入主题,怎么用C++实现matlab中的wavread(‘testwav.wav’)函数,且输出一致。

    3.1 编码转换规则
    在介绍之前,我们需要了解这几串数据之间的关系。本章节以test.wav文件的数据为例来分析:

    (1)该wave文件的Data块即原始采样数据的最后20个数据是:

    fc ff fe ff f8 ff f7 ff f9 ff f8 ff f8 ff f5 ff fb ff f9 ff

    (2)在matlab中解析得到的最后10个数据是:

    -0.0001 -0.0001 -0.0002 -0.0003 -0.0002 -0.0002 -0.0002 -0.0003 -0.0002 -0.0002

    这两组数据之间是原码与补码的关系,即(1)是原码而(2)是补码。

    由数据(1)转换为数据(2)的步骤是:先将(1)转换为其补码,再用补码除以32768,则得到(2)。

    原码与补码之间的转换原则:

    (2进制形式的转换):若原码为正数,则补码是其本身。若原码为负数,则补码为符号位不变,数值位按位取反,再加1。

    (数值形式的转换):若原码为正数,则补码是其本身。若原码为负数,补码 = 原码 - 2^16。温馨提示: 为了方便计算数值上有等价替换 2^16 = FFFF - 1。

    为了更好的理解,举例说明:

    步骤一(每次读16字节):由于数据是从X0000到XFFFF的数据。以f9 ff为例,右端为大端,换言之,右端是高位,则应该是fff9。步骤二(转换为补码):按位转换为二进制形式为1111 1111 1111 1001(1位16进制数值对应4位二进制数值),该数据为原码,转换成带符号的十进制形式,先看符号位判断其为负数,则补码为FFF9 - FFFF -1 = -7。步骤三(归一化):用补码数值-7除以32768,取小数点后4位(四舍五入),则等于-0.0002,正确。

    读者可以试着用我的方法算一下(1)中的右起第3第4个数,是否对应等于(2)的右起第2个数。

    3.2 C++实现
    那么C++实现,就是先读取原始采样数据,每次读16字节,然后将16字节的16进制数字转化成十进制数,再转换成其补码,并归一化。转换时注意大小端和符号问题。

    具体的C++代码,我已分享,读者可移步查看:
    http://www.oschina.net/code/snippet_1768500_39013
    参考文献
    http://www.cnblogs.com/liyiwen/archive/2010/04/19/1715715.html

    本文转载自:https://www.imooc.com/article/22968

    展开全文
  • 答:这是我自己曾经写的一段代码,希望对你有借鉴 clc; fs=8000; channel=1; t=5; fprintf('按任意键后开始 %d 秒录音:',t); pause; fprintf('录音中...');%文字提示 y=wavrecord(t*...答:wavread只能读取非压缩格...

    答:这是我自己曾经写的一段代码,希望对你有借鉴 clc; fs=8000; channel=1; t=5; fprintf('按任意键后开始 %d 秒录音:',t); pause; fprintf('录音中...');%文字提示 y=wavrecord(t*fs, fs,channel,'double');%录制语音信号 fprintf('录音结束\n');...

    答:wavread只能读取非压缩格式的wav音频文件。wav文件一般都是压缩的,用matlab播放时需要用转换程序将其转换为非压缩格式的wav。

    答:一般提示这个就是那个变量或者函数没有定义。如果你是从其它人那里随便考过来的代码片段,这种现象就很常见,需要找到那个人把代码考全才行。有可能是一个文件没拷全,也有可能是原来是好几个相互依赖的文件都要拷过来。 必须要定义,定义之后才...

    答:用wavread命令读声音数据是低版本的,高版本中已不用它,删掉了,再出现这个命令,就会显示错误信息,提示改用audioread命令。

    答:你这个程序这么写没有问题,我在我这边也验证过了。我觉着你可能确实是路径的问题,你直接打开那个文件所在的位置,然后把地址栏中的地址粘贴进去,然后敲个斜杠,再复制一下文件名试试吧。

    答:wavread函数 函数语法 y = wavread(filename) [y, Fs] = wavread(filename) [y, Fs, nbits] = wavread(filename) [y, Fs, nbits, opts] = wavread(filename) [...] = wavread(filename, N) [...] = wavread(filename, [N1 N2]) [...] = wavread(...

    答:我也出现了同样的问题 ,还请指点下啊

    答:矩阵a和b的大小不一致,不能相减。 原因是wav1和wav2的行数不相同。

    答:help wavread ,matlab帮助里解释的很清楚,只能读取.wav格式的音频文件,可以选取读取数据的位置范围,想要读取.mp3格式得转换,或者下一个读取mp3的函数

    答:waveread函数只支持脉冲编码调制(PCM)数据格式,所以一般的wav格式matlab是不认的,所以需要用一些格式转换软件,自定义一下输出格式,改为PCM输出即可。然后就是wavread的文件路径必须是完整路径。

    展开全文
  • wavread - Read WAVE (.wav) sound file  This MATLAB function loads a WAVE file specified by the string filename,  returning the sampled data in y.  y = wavread(filename)  [y, Fs] = wavrea...

    wavread - Read WAVE (.wav) sound file

        This MATLAB function loads a WAVE file specified by the string filename,
        returning the sampled data in y.

        y = wavread(filename)
        [y, Fs] = wavread(filename)
        [y, Fs, nbits] = wavread(filename)
        [y, Fs, nbits, opts] = wavread(filename)
        [___] = wavread(filename, N)
        [___] = wavread(filename, [N1 N2])
        [___] = wavread(___, fmt)
        siz = wavread(filename,'size')

    audioread - Read audio file

        This MATLAB function reads data from the file named filename, and returns
        sampled data,y, and a sample rate for that data, Fs.

        [y,Fs] = audioread(filename)
        [y,Fs] = audioread(filename,samples)
        [y,Fs] = audioread(___,dataType)

    wavwrite - Write WAVE (.wav) sound file

        This MATLAB function writes the data stored in the variable y to a WAVE file
        called filename.

        wavwrite(y,filename)
        wavwrite(y,Fs,filename)
        wavwrite(y,Fs,N,filename)

    audiowrite - Write audio file

        This MATLAB function writes a matrix of audio data, y, with sample rate Fs to a
        file called filename.

        audiowrite(filename,y,Fs)
        audiowrite(filename,y,Fs,Name,Value)

    [y,Fs] = wavread('ISM.wav');

    [y,Fs] = audioread('ISM.wav');
    filename = 'ISM.wav';

    wavwrite(y,Fs,filename);
    audiowrite(filename,y,Fs);

    以上是wavwrite函数,audiowrite函数区别

     

    展开全文
  • 你给的这段代码里并没有看到 wavread 呀?一般提示这个就是那个变量或者函数没有定义。如果你...情况一:符号变量必须要定义定义之后才可以...fs是采...wavread函数 函数语法 y = wavread(filename) [y...wavre...
  • sol = scipy.optimize.root(tssub.sfunc1, czt, method='lm') tssub.sfunc1:定义的信号函数; czt:是前面通过数值过零点搜索获得的28个根的数值; 如下是sol['x']中的数值,包含了最终优化后的数值,对比前面通过...
  •  % 构成完整的路径和文件名 [s, fs, bits] = wavread(fle); % 读入数据文件 s=s-mean(s); % 消除直流分量 s=s/max(abs(s)); % 幅值归一 N=length(s); % 语音长度 time=(0:N-1)/fs; % 设置时间刻度 SNR=5; % ...
  • matlabwavread用法

    2021-04-18 13:50:13
    如: WAV文件(例:wavread,sound 等)。2、图形文件。如: bmp 、gif 等。 7 Matlab语言的主要特点(续) ? 使用方便,具有很好的扩张功能1、使用Matlab语言编写的......matlab 变声程序_工学_高等教育_教育专区。 以下是...
  • 通过冲激抽样函数δt(t)对信号f(t)进行抽样,得到抽样函数fs(t)=f(t)δt(t) 时域的乘积,对应频域的卷积 这里用到了一般周期信号的傅里叶变换公式 其中T1是信号的周期。 Fs(ω)的表达式告诉我们,采样信号的频谱...
  • 请问我这个问题要怎么解决?显示我未定义函数或变量 ,wavrecord和wavread都现显示的未定义?
  • 目录1 常用命令表1.1 管理用命令表1.2管理变量与工作空间用命令表1.3文件与操作系统处理命令表1.4窗口控制命令表1.5启动与退出命令2 运算符号与特殊字符表表2.1运算符号与特殊字符表2.2逻辑函数3 语言结构与调试表...
  • fortran语言常用函数

    2021-05-24 02:54:05
    函数与函数库操作 deff 在线定义函数 edit 函数编辑器 function 打开函数定义 functions SCILAB 函数或对象 genlib 在给定目录下建立所有文件的 函数库 get_function_path 读函数库的文件存储目录 路径 getd 读...
  • 语音信号的处理与分析2.3 系统框架及实现 2.3.1 语音信号的采样利用Windows下的录音机,录制一段自己的语音,要求长度不小于10s,然后在Matlab软件平台下,利用函数wavread对语音信号进行采样,记住采样频率和采样...
  • 设计思路 (1)自相关函数 对于离散的语音信号x(n),它的自相关函数定义为: R(k)=Σx(n)x(n-k), 如果信号x(n))具有周期性,那么它的自相关函数也具有周期性,而且周期与信号x(n)的周期性相同。自相关函数提供了一种...
  • 我需要从我的模块中调用Python函数并为其设置两个参数:int和array。在现在我在调用这个函数的时候遇到了segfault,我不知道我做错了什么。有人能指出我的错误在哪里吗?在函数在我的Python模块中应用程序副本. 如果...
  • x1=wavread('D:\1.wav'); %读取语音信号的数据,赋给变量x1 fs=16000; %播放语音信号 y1=fft(x1,1024); %对信号做1024点FFT变换 f=fs*(0:511)/1024; figure(2) subplot(2,1,1); plot(abs(y1(1:512))) %做原始...
  • matlab中label函数

    千次阅读 2021-04-18 12:30:28
    Xlabel Ylabel Text Gtext Grid MATLAB 编程语言 Function Eval Feval Global 箭头图 绘图函数 星点图 Isletter Isspace 当变量为字母时,其值为真 当变量为空白......分布累计概率函数 chi2inv 分布逆累计概率函数 ...
  • 最后你那zd句plot(int(k),double(s));里的int(k);不对。你如果想以k为横坐标,直接把int去掉,如回果...符号变量定义方法例如:sym x 或者 syms x,两者有区别也有共同点。情况二:计算过程当中的存储数值的变量 可以...
  • 该楼层疑似违规已被系统折叠隐藏此楼查看此楼clear;if nargin<1;action='initialized';end;[fname,pname]=uigetfile('*.wav','Open Wave ...[x,fs,bits]=wavread(file); % 读入声音文件(*.wav)sound(x,fs,bits...
  • 本人新手小白,因论文需求 使用下面的代码求解 clc clear Ex=[92.5,80,70,60,27.5;92.5,80,70,60,27.5;... 出现未定义函数或变量“x” 求各位大佬指点一下,以及看一下是否还存在其他的问题,感激不尽!
  • matlab 常用函数

    2020-12-22 17:31:16
    一 matlab常用函数1、 特殊变量与常数ans 计算结果的变量名 computer 确定运行的计算机 eps 浮点相对精度 Inf 无穷大 I 虚数单位 inputname输入参数名 NaN 非数 nargin 输入参数个数 nargout 输出参数的数目 pi ...
  • [Matlab]FIR滤波器设计:(基本窗函数FIR滤波器设计)

    万次阅读 多人点赞 2019-11-16 00:54:00
    [Matlab]FIR滤波器设计:(基本窗函数FIR滤波器设计) ​ IIR滤波器主要设计方法先设计一个模拟低通滤波器,然后把它转化为形式上的数字滤波器。但对于FIR滤波器来说,设计方法的关键要求之一就是保证线性相位条件。而...
  • matlab常用函数与常用指令大全

    万次阅读 多人点赞 2016-05-06 14:11:58
    matlab常用函数与常用指令大全 matlab常用函数- - 1、特殊变量与常数 ans 计算结果的变量名 computer 确定运行的计算机 eps 浮点相对精度 Inf 无穷大 I 虚数单位 inputname 输入参数名 NaN 非数 ...
  • MATLAB 函数大全

    千次阅读 多人点赞 2012-07-30 13:30:00
    函数名 功能描述 函数名 功能描述 addpath 增加一条搜索路径 rmpath 删除一条搜索路径 demo 运行Matlab演示程序 type 列出.M文件 doc 装入超文本文档 version 显示Matlab的版本号 help ...
  • 代码层次 Python是一门脚本语言,新建一个.py文件,写点代码,就可以跑起来了,无论放哪都可以。比如where.py文件: print("Where am I?...模块中可以写函数和类,模块可以放在包中。 函数 Python中最出名...
  • matlab函数大全

    万次阅读 多人点赞 2017-02-16 14:06:11
    MATLAB学习笔记——函数使用
  • ,它的自相关函数定义为:  R(k)= Σ x(n)x(n-k) , 如果信号 x(n)) 具有周期性,那么它的自相关函数也具有周期性,而且周期与信号 x(n) 的周期性相同。自相关函数提供了一种获取周期信号周期的方法。在周期信号...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 756
精华内容 302
关键字:

wavread函数如何定义

友情链接: natuxal-dynami.zip