精华内容
下载资源
问答
  • Matlab 生成任意波形wav文件

    千次阅读 2020-04-10 22:37:51
    1、背景   测试DAC/功放的性能指标的...  曾经一开始接触这部分调试的时候,从网上找了些音频文件,发现怎么测参数都不对,后来从别人那里考来了一份常用的1K文件,才得出像样点的结果,由于此文件需要的精度...

    1、背景

      测试DAC/功放的性能指标的时候,常需要 1KHz 的波形来分析,主要测试参数有输出幅度,相移、失真度、频响曲线、信噪比(SNR)等常用的手段来评估设备的好坏程度,测试仪器一般选用AG,粗略测试也可以使用稍微好一点的示波器。
      曾经一开始接触这部分调试的时候,从网上找了些音频文件,发现怎么测参数都不对,后来从别人那里考来了一份常用的1K文件,才得出像样点的结果,由于此文件需要的精度高,而网上下载的文件质量参差不齐,而且没有所需要的各种格式,比如各采样率、位深、时常、特殊幅值、任意频率等的参数,所以干脆自己写一个程序来生成,所有内部的波形都能够看得出来,会比较放心地拿来测试。
      对音频这块比较专业的软件有 Adobe Audition 这一款,很适合音频录制、编辑和混合,但是作为程序员,还是喜欢通过用代码来生成想要的内容,因此选择使用 Matlab,Matlab 在信号处理上,也可以说是老大了,各种处理的算法基本都是有对应的函数库,就算有些没有,编写起来也很容易,包含了众多科学/工程领域的包及仿真工具。当然,对于本文这种比较小的需求,虽说有种牛刀杀鸡的感觉,但是未尝不是一个学习的过程,再不用一下,在学校里学的就得忘光了。

    2、实现

      本文是该分栏的第一篇文章,上述废话多了点哈,后面的代码都尽量保证代码的注释多点,也欢迎大家来指正错误一起学习哦,现在开始来实现吧~~

    2.1 参数定义

    可以自由设置的参数如下,同学们可以根据需要来修改想要的参数,然后运行一下来生成wav文件。
    在这里插入图片描述
    代码片段(csdn 的 markdown 貌似对 m 文件的支持不太好,没有高亮 - -。):

     %%  参数定义  %%%%%%%%%%%
    fs = 96000;             % 采样频率
    bps = 16;               % 位深 bit
    Tfile = 60;             % 声音片段的总时长,单位s
    vol = 0;                % 声音片段的音量 0db
    sinewave1_fs = 1000;    % 左声道频率,单位Hz
    sinewave2_fs = 1000;    % 右声道频率
    stereo = 1;             % 0:单声道,1:立体声
    filename = ('96000_16b_1KHz_60s_stereo_gen_by_Matlab.wav'); %输出文件名称(自己定义,后缀是.wav)
    

    2.2 生成时间序列

    生成一个时间序列,序列里每一个点对应一个采样点。
    在这里插入图片描述

    代码片段:

    %% 生成时间序列
    Df = 1;                 % 频率间隔,默认1
    T = 1/fs;               % 采样周期
    N = fs/Df;              % 序列点数
    time = Tfile*(N-1)*T;   % 文件总时长
    t = 0:T:time;           % 生成每一个采样点对应的时间序列
    

    2.3 生成左右声道波形

    调用正弦函数来生成波形,参数为 2.1 定义的参数,照葫芦画瓢,可以将 sin 函数 替换成其他函数,生成各种你想要的波形。
    在这里插入图片描述
    代码片段:

    %% 生成左右声道波形
    y1 = sin(2*pi*sinewave1_fs*t)*(db2mag(vol));    % 生成第一个声音片段,注意需要用db2mag()函数把dB转换成magnitude。
    y2 = sin(2*pi*sinewave2_fs*t)*(db2mag(vol));    % 生成第二个声音片段,若需不同赋值,可以在参数定义中增加一个 vol_2 来控制第二段的赋值。 
    if stereo == 0                                  % 选择单声道输出
            y = y1';                                %   输出的 y 只使用 y1, 左声道(单声道)
            y2 = 0*sin(2*pi*sinewave2_fs*t);        %   令 y2 为 0
    else                                            % 选择立体声输出
            y = [y1',y2'];                          %   合成立体声
    end
    

    2.4 播放生成的波形

    生成的波形文件可以通过 sound() 函数来播放。
    在这里插入图片描述

    代码片段:

    %% 通过电脑音频输出口,播放生成的波形
    whos y              % 命令行打印 y 的信息
    if fs < 192000      % 电脑不能支持大于 192K 的声音输出,但是可以正常生成。
        sound(y,fs)     % 可以播放声音的函数 sound()
    end
    

    2.5 描绘波形图像

    这部分比较简单,关键点是要顺便写一下验错的流程,直接上图看注释。
    在这里插入图片描述
    代码片段:

    %% 描绘波形图像
    if stereo == 0              % 如果选择单声道输出 
        subplot(2,1,1);         %     选中第一个图片位置
        plot(t,y1);             %     描绘左声道生成波形
        title('左声道生成波形'); 
        subplot(2,1,2);         %     选中第二个图片位置
        plot(y1(1:200));        %     打印左声道 1~200的值,如果下面读取成功,此值会被覆盖
        title('左声道读取失败'); %     若后面读取正常,该值会被覆盖(即读取成功的话,将看不到这句话,用于验错)
    
    else                        % 如果选择立体声输出 
        subplot(4,1,1);         %     选中第一个图片位置
        plot(t,y1);             %     描绘左声道生成波形
        title('左声道生成波形');
        subplot(4,1,2);         %     选中第二个图片位置
        plot(t,y2);             %     描绘右声道生成波形
        title('右声道生成波形');
        subplot(4,1,3);         %     选中第三个图片位置
        plot(y1(1:200))         %     打印左声道 1~200的值,如果下面读取成功,此值会被覆盖
        title('左声道读取失败'); %     若后面读取正常,该值会被覆盖(即读取成功的话,将看不到这句话,用于验错)
        subplot(4,1,4);         %     选中第四个图片位置
        plot(y2(1:200))         %     打印右声道 1~200的值,如果下面读取成功,此值会被覆盖
        title('右声道读取失败'); %     若后面读取正常,该值会被覆盖(即读取成功的话,将看不到这句话,用于验错)
    end
    

    2.6 写入 .wav文件

    在这里插入图片描述
    代码片段:

    %% 写入文件
    audiowrite(filename,y,fs,'BitsPerSample',bps);  % 存储.wav音频文件,文件名在参数定义里设置
    AudioInfo = audioinfo(filename)                 % 这里不用加分号,可以顺便在命令窗口看看写入文件的打印信息
    

    2.7 读取生成的 wav 文件进行,并描绘波形

    读取波形文件,若读取失败,则无法打印正确的波形,此时需要检查是否生成的参数设置有误
    在这里插入图片描述
    代码片段:

    %%   读取刚才生成的 wav 文件进行,并描绘波形
    [y_read,FS]=audioread(filename);    % 将 WAV 文件转换成变量
    whos y_r                            % 打印一下 y_read 信息
    if stereo == 0                      % 如果选择单声道 
        y_read1 = y_read(:,1);          %	提取声道
        subplot(2,1,2);                 %	选中第二个图片位置
        plot(t,y_read1);                %   描绘左声道读取波形,覆盖上一步骤的验错内容
        title('左声道读取波形');
    else                                % 如果选择立体声 
        y_read1 = y_read(:,1);          %	提取左声道
        subplot(4,1,3);                 %   选中第三个图片位置
        plot(t,y_read1);                %   描绘左声道读取波形,覆盖上一步骤的验错内容
        title('左声道读取波形');
        y_read2 = y_read(:,2);          %	提取右声道
        subplot(4,1,4);                 %   选中第四个图片位置
        plot(t,y_read2);                %   描绘右声道读取波形,覆盖上一步骤的验错内容
        title('右声道读取波形');
    end
    

    OK ,到这里功能已经实现了,第一个 Matlab 分享代码注释写的算是较为详细了,方便自己也方便大家,学习的路上共勉。

    3、完整代码

    代码比较简单,不需要其他配置,直接复制到Matlab上即可成功运行,各位有需要用到的可以试试哦。

    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    %   功能:生成任意正弦波形文件(单声道 or 立体声) % 
    %   作者:Mr-Ma Technology(马健维)             %
    %   时间:2019.08.31                           %
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    
    clear; 
    close all; 
    clc;
     %%  参数定义  %%%%%%%%%%%
    fs = 96000;             % 采样频率
    bps = 16;               % 位深 bit
    Tfile = 60;             % 声音片段的总时长,单位s
    vol = 0;                % 声音片段的音量 0db
    sinewave1_fs = 1000;    % 左声道频率,单位Hz
    sinewave2_fs = 1000;    % 右声道频率
    stereo = 1;             % 0:单声道,1:立体声
    filename = ('96000_16b_1KHz_60s_stereo_gen_by_Matlab.wav'); %输出文件名称(自己定义,后缀是.wav)
    
    %% 生成时间序列
    Df = 1;                 % 频率间隔,默认1
    T = 1/fs;               % 采样周期
    N = fs/Df;              % 序列点数
    time = Tfile*(N-1)*T;   % 文件总时长
    t = 0:T:time;           % 生成每一个采样点对应的时间序列
    
    %% 生成左右声道波形
    y1 = sin(2*pi*sinewave1_fs*t)*(db2mag(vol));    % 生成第一个声音片段,注意需要用db2mag()函数把dB转换成magnitude。
    y2 = sin(2*pi*sinewave2_fs*t)*(db2mag(vol));    % 生成第二个声音片段,若需不同赋值,可以在参数定义中增加一个 vol_2 来控制第二段的赋值。 
    if stereo == 0                                  % 选择单声道输出
            y = y1';                                %   输出的 y 只使用 y1, 左声道(单声道)
            y2 = 0*sin(2*pi*sinewave2_fs*t);        %   令 y2 为 0
    else                                            % 选择立体声输出
            y = [y1',y2'];                          %   合成立体声
    end
    
    %% 通过电脑音频输出口,播放生成的波形
    whos y              % 命令行打印 y 的信息
    if fs < 192000      % 电脑不能支持大于 192K 的声音输出,但是可以正常生成。
        sound(y,fs)     % 可以播放声音的函数 sound()
    end
    
    %% 描绘波形图像
    if stereo == 0              % 如果选择单声道输出 
        subplot(2,1,1);         %     选中第一个图片位置
        plot(t,y1);             %     描绘左声道生成波形
        title('左声道生成波形'); 
        subplot(2,1,2);         %     选中第二个图片位置
        plot(y1(1:200));        %     打印左声道 1~200的值,如果下面读取成功,此值会被覆盖
        title('左声道读取失败'); %     若后面读取正常,该值会被覆盖(即读取成功的话,将看不到这句话,用于验错)
    
    else                        % 如果选择立体声输出 
        subplot(4,1,1);         %     选中第一个图片位置
        plot(t,y1);             %     描绘左声道生成波形
        title('左声道生成波形');
        subplot(4,1,2);         %     选中第二个图片位置
        plot(t,y2);             %     描绘右声道生成波形
        title('右声道生成波形');
        subplot(4,1,3);         %     选中第三个图片位置
        plot(y1(1:200))         %     打印左声道 1~200的值,如果下面读取成功,此值会被覆盖
        title('左声道读取失败'); %     若后面读取正常,该值会被覆盖(即读取成功的话,将看不到这句话,用于验错)
        subplot(4,1,4);         %     选中第四个图片位置
        plot(y2(1:200))         %     打印右声道 1~200的值,如果下面读取成功,此值会被覆盖
        title('右声道读取失败'); %     若后面读取正常,该值会被覆盖(即读取成功的话,将看不到这句话,用于验错)
    end
    
    %% 写入文件
    audiowrite(filename,y,fs,'BitsPerSample',bps);  % 存储.wav音频文件,文件名在参数定义里设置
    AudioInfo = audioinfo(filename)                 % 这里不用加分号,可以顺便在命令窗口看看写入文件的打印信息
    
    %%   读取刚才生成的 wav 文件进行,并描绘波形
    [y_read,FS]=audioread(filename);    % 将 WAV 文件转换成变量
    whos y_r                            % 打印一下 y_read 信息
    if stereo == 0                      % 如果选择单声道 
        y_read1 = y_read(:,1);          %	提取声道
        subplot(2,1,2);                 %	选中第二个图片位置
        plot(t,y_read1);                %   描绘左声道读取波形,覆盖上一步骤的验错内容
        title('左声道读取波形');
    else                                % 如果选择立体声 
        y_read1 = y_read(:,1);          %	提取左声道
        subplot(4,1,3);                 %   选中第三个图片位置
        plot(t,y_read1);                %   描绘左声道读取波形,覆盖上一步骤的验错内容
        title('左声道读取波形');
        y_read2 = y_read(:,2);          %	提取右声道
        subplot(4,1,4);                 %   选中第四个图片位置
        plot(t,y_read2);                %   描绘右声道读取波形,覆盖上一步骤的验错内容
        title('右声道读取波形');
    end
    
    

    4、运行图片

    为了让图片看出正弦波形,修改文件时长为 0.1s。
    在这里插入图片描述

    展开全文
  • 计数器常用在分频、定时等处。计数器种类很多,按照计数方式不同可以分为二进制计数器、十进制计数器以及任意进制计数器,按照触发器时钟脉冲信号来源可分为同步计数器与异步计数器。按照计数增减可分为加法...

    一、计数器简介

    计数器的核心元件是触发器,基本功能是对脉冲进行计数,其所能记忆脉冲最大的数目称为该计数器的模/值。计数器常用在分频定时等处。计数器的种类很多,按照计数方式的不同可以分为二进制计数器十进制计数器以及任意进制计数器,按照触发器的时钟脉冲信号来源可分为同步计数器异步计数器。按照计数增减可分为加法计数器减法计数器以及可逆计数器

    下图为一个基本的计数器:
    基于D触发器的计数器

    二、代码

    全部代码如下:

    module counter #(
    	parameter M = 100	//计数器模长
    )(
    	input wire						clk,//时钟
    	input wire 						rst,//复位
    	input wire 						en,	//使能信号
    	output reg	[$clog2(M) - 1 : 0]	cnt,//计数输出
    	output wire 					co	//记满信号
    );
    	assign co = en&(cnt == M-1);				//给线网型变量CO赋值
    	
    	always@(posedge clk or negedge rst) begin
    	if(!rst) cnt <= 1'b0;						//复位
    		else if(en) begin
    			if(cnt < M - 1) cnt <= cnt + 1'b1;	//计数
    			else cnt <= 1'b0;					//记满归零
    		end
    	end
    endmodule
    
    

    这是一个简单的带有复位和使能信号的循环计数器,模长为100。可以在例化时通过修改参数M的值来更改模长,从而实现不同频率的分频输出。

    三、简单说一说

    module counter #(
    	parameter M = 100	//计数器模长
    )(
    	input wire								clk,//时钟
    	input wire 								rst,//复位
    	input wire 								en,	//使能信号
    	output reg		[$clog2(M) - 1 : 0] 	cnt,//计数输出
    	output wire 							co	//记满信号
    );
    

    总共有三个输入端口和两个输出端口:输入端口有时钟clk、复位rst、使能en,均为线网类型的变量。时钟端口用于接收时钟脉冲进行计数,复位信号可以给计数器异步置零,使能信号控制计数器是否能进行计数。输出端口有计数cnt,记满信号co,其中cnt为寄存器类型的变量,co为线网类型的变量。其中$clog2(M) - 1为取M以2为底的对数,即针对模长求寄存器的位宽。当寄存器计满后,cnt清零,co拉高。随即co会被拉低,留下一个半周期长的高电平。

    四、仿真

    由于模块比较简单,可以不使用Modelsim进行仿真,改用波形矢量文件进行观察。在这里插入图片描述
    点击"New"或按Ctrl+N
    在这里插入图片描述
    选择"University Program VWF",出现如下窗口:在这里插入图片描述
    双击左侧栏空白处,弹出如下小对话框:在这里插入图片描述
    点击"Node Finder",如下在这里插入图片描述
    单击"List"后点击双箭头>>将变量全部添加到观察窗口中,再点击OK,可以看到左侧栏中已有信号,下面介绍几个按键。在这里插入图片描述
    从左到右依次为:设为未知、拉低、拉高、设为高阻态、设为弱低电平、设为弱高电平、翻转、计数、设置时钟脉冲、任意值、随机数值、功能仿真、时序仿真、产生Modelsim的testbench和脚本。设置好各输入端口的信号后点击功能仿真,得到如图波形:在这里插入图片描述
    右键cnt可以更改数据进制,例如更改为无符号十进制数Unsigned Decimal:在这里插入图片描述

    五、小结

    计数器是最基本的时序逻辑电路之一,希望能够通过计数器加深对时序逻辑电路描述方式的印象。另外,波形矢量文件只能看一些比较简单的模块,如果用到了比较复杂的模块,还得靠Modelsim。

    展开全文
  • 波形文件(.wav)读写操作

    热门讨论 2011-06-07 16:26:23
    对wav文件控制函数说明(常用mmio函数:  mmioOpen( ) 打开一个RIFF文件  mmioDescend ( ) 进入块  mmioRead( ); 该取RIFF文件  mmioAscend ( ); 跳出块  mmioClose( ); 关闭PIFF文件  对于块来说,...
  • 画出wav文件声音数据的波形曲线

    千次阅读 2013-03-25 17:34:47
    波形音频文件(*.WAV)是Microsoft为Windows设计的多媒体文件格式RIFF(The Resource Interchange File Format,资源交换文件格式)中的一种(另一种常用的为AVI)。RIFF由文件头、数据类型标识及若干块(chunk)组成。 ...

         WAV文件格式

    波形音频文件(*.WAV)是Microsoft为Windows设计的多媒体文件格式RIFF(The Resource Interchange File Format,资源交换文件格式)中的一种(另一种常用的为AVI)。RIFF由文件头、数据类型标识及若干块(chunk)组成。
     
    WAV文件的基本格式
    内容
    变量名
    大小
    取值
    RIFF头 文件标识符串 fileId 4B “RIFF”
    头后文件长度 fileLen 4B 非负整数(=文件长度-8)
    数据类型标识符 波形文件标识符 waveId 4B “WAVE”
    格式块 块头 格式块标识符串 chkId 4B

    “fmt ”

    头后块长度 chkLen 4B 非负整数(= 16或18)
    块数据 格式标记 wFormatTag 2B 非负短整数(PCM=1)
    声道数 wChannels 2B 非负短整数(= 1或2)
    采样率 dwSampleRate 4B 非负整数(单声道采样数/秒)
    平均字节率 dwAvgBytesRate 4B 非负整数(字节数/秒)
    数据块对齐 wBlockAlign 2B 非负短整数(不足补零)
    采样位数 wBitsPerSample 2B 非负短整数(PCM时才有)
    扩展域大小 wExtSize 2B 非负短整数 可选(根据chkLen=16or 18判断)
    扩展域 extraInfo

    extSize B

    扩展信息
    数据块 块头 数据块标识符串 chkId 4B

    “data”

    头后块长度 chkLen 4B 非负整数
    块数据 波形采样数据 x或xl、xr

    chkLen B

    左右声道样本交叉排列
    样本值为整数(整字节存储,不足位补零),
    整个数据块按blockAlign对齐
     
    注意:

           wFormatTag = 1时为无压缩的PCMPulse Code Modulation, 脉冲编码调制)标准格式(即等间隔采样、线性量化)。

          单字节样本值v为无符号整数(0~255),实际样本值应为v-128;多字节样本值本身就是有符号的,可直接使用。

    有些wav文件在data块之前,fmt块之后还有一个fact块..

    |  ID    |  4 Bytes |   'fact'          |
            ----------------------------------
          | Size  |  4 Bytes |   数值为4    |
           ----------------------------------
          | data  |  4 Bytes |  ?? ?? ?? ??  | 

    因此要根据读到的ID进行判断

    参考: http://www.snowcn.net/?action/viewspace/itemid/260.html  wav文件格式分析详解


    Wav文件 所有数值表示均为低字节表示低位,高字节表示高位。

    通过CArchive的>>读入, 会自动转化(把高字节的作为高位)

    如读入地址为0000000的双字(DWORD)到变量dw中 :

    0000000: 52 49 46 46 

    则dw会等于0x46464952

     
    为了简化RIFF文件中的4字符标识的读写与比较,Windows SDK在多媒体头文件mmsystem.h中定义了类型
    FOURCC(Four-Character Code四字符代码):

    typedef DWORD FOURCC;

    及其构造宏(用于将4个字符转换成一个FOURCC数据)

    FOURCC mmioFOURCC(CHAR ch0, CHAR ch1, CHAR ch2, CHAR ch3);

    其定义为MAKEFOURCC宏:

    #define  mmioFOURCC(ch0, ch1, ch2, ch3)  MAKEFOURCC(ch0, ch1, ch2, ch3);

    而MAKEFOURCC宏定义为:

    #define MAKEFOURCC(ch0, ch1, ch2, ch3)  /

        ((DWORD)(BYTE)(ch0) | ((DWORD)(BYTE)(ch1) << 8) |  /

        ((DWORD)(BYTE)(ch2) << 16) | ((DWORD)(BYTE)(ch3) << 24 ));

    例如:

    #include <mmsystem.h>

    #define ID_RIFF    mmioFOURCC('R', 'I', 'F', 'F')

    #define ID_WAVE   mmioFOURCC('W', 'A', 'V', 'E')

    ……

    FOURCC id;

    ……

                  ar >> id;

                  if (id != ID_RIFF) {

           ……

    }

    ……

    l         播放波形声音文件

    函数PlaySound可以播放系统声音、声音资源和声音文件,其函数原型为:

    BOOL PlaySound(

      LPCSTR pszSound, 

      HMODULE hmod,    

      DWORD fdwSound

    );

    例如:

    PlaySound(“c://sounds//sample.wav”, NULL, SND_ASYNC);

                  PlaySound(ar.GetFile()->GetFilePath(), NULL, SND_ASYNC);

     

    下面是完整步骤:

    新建MFC应用程序, 单文挡(SDI)项目WavePlayer.

    为了使包含PlaySound的程序能够编译通过,必须包含多媒体头文件: #include <mmsystem.h>, 而且需要注意头文件包含的次序.. 否则会提示找不到标识符..

    并在项目中添加多媒体库:在项目区中任何页中选中顶部的项目名,选“项目/属性”菜单项或按Alt+F7组合键,弹出“[项目名]属性页”对话框,在该其左上角的“配置”栏的下拉式列表中,选择“所有配置”项,在其左边的“配置”目录栏中,选中“配置属性/链接器/输入”项,在右边顶行的“附加依赖项”栏中键入winmm.lib,按“确定”钮关闭对话框。

     

    文件过滤

    可通过修改资源视图页的“项目名/项目名.rc/String Table/String Table”串表资源中的ID:IDR_MAINFRAME(SDI)所对应的串,为应用程序的文件I/O对话框增加文件过滤器。为WavePlayer程序增加*.wav的过滤器:

    将原来的串

    IDR_MAINFRAME  “WavePlayer/n/nWavePlayer/n/n/nWavePlayer.Document/nWavePlayer.Document”

    修改成

    “WavePlayer/n/nWavePlayer/nWave Files (*.wav)/n.wav/nWavePlayer.Document/nWavePlayer.Document”

     

     

    文档类cpp 添加如下宏

    #define ID_RIFF mmioFOURCC('R''I''F''F')

    #define ID_WAVE mmioFOURCC('W''A''V''E')

    #define ID_data mmioFOURCC('d''a''t''a')

    #define ID_fmt  mmioFOURCC('f''m''t',  '/x20')

    #define ID_fact mmioFOURCC('f''a''c',  't')

     

     

    文档类添加如下变量

    public:

        int num;         // 样本数

        LONG* data;      // 样本数据

        LONG *Ldata, *Rdata;     // 双声道数据

        WORD BytesPerSample, wChannel;     // 一个样本的字节数,  声道数

     

    Serialize函数添加如下代码:

    if (ar.IsStoring())

        
    {

            
    // TODO: 在此添加存储代码

        }


        
    else

        
    {

            
    // TODO: 在此添加加载代码

            FOURCC id, chkLen,  dw;    
    // 无符号双字

            BYTE b;               
    // 无符号字节

            WORD w;              
    // unsined short  无符号单字长

            WORD fmtTag;           
    //格式标记

            WORD wBitsPerSample;   
    //样本位数

            FOURCC dwAvgBytesRate;  

            FOURCC Len;          
    // 数据块大小,  BYTE

            ar
    >>id;

            
    if(id!=ID_RIFF)  return;

            ar
    >>dw>>id;

            
    if(id!=ID_WAVE) return;

            ar
    >>id; if(id!=ID_fmt)  return;

            ar
    >>chkLen;            // 16或

            ar
    >>fmtTag;            // 只处理PCM(Pulse Code Modulation, 脉冲编码调制)情况

            
    if(fmtTag!=1)

                
    return;

            ar
    >>wChannel;           //声道数

            ar
    >>dw;                 //采样率

            ar
    >>dwAvgBytesRate;     //平均字节率

            ar
    >>w;                  //数据块对齐

            ar
    >>wBitsPerSample;     //样本位数

            
    if(chkLen==18)

            
    {

                ar
    >>w;               // 扩展域大小

                
    for(int i=0; i<w; i++)  // 读走扩展域的内容

                    ar
    >>b;

            }


            ar
    >>id;            // data or fact

            
    if(id==ID_fact)

            
    {

                ar
    >>dw>>dw;        // 读走fact块内容

                ar
    >>id;    //      data  ID

            }


            
    if(id!=ID_data)

                
    return;

            ar
    >>Len;          

            BytesPerSample
    =wBitsPerSample/8;         // 一个样本的字节数

            num
    =Len/BytesPerSample;              // 样本数

            
    if(wChannel==1)                 // 单音道

            
    {

                data
    =new LONG[num];

                
    if(BytesPerSample==1)

                    
    for(int i=0; i<num; i++)

                    
    {

                        ar
    >>b;

                        data[i]
    =b-128;

                    }


                
    else if(BytesPerSample==2)

                    
    for(int i=0; i<num; i++)

                    
    {

                        ar
    >>w;

                        data[i]
    = (SHORT)w;         // 无符号数转成有符号数

                    }


                
    else if(BytesPerSample==4)

                    
    for(int i=0; i<num; i++)

                    
    {

                        ar
    >>dw;

                        data[i]
    =(LONG)w;          // 无符号数转成有符号数

                    }


                
    else if(BytesPerSample==3)

                    
    for(int i=0; i<num; i++)

                    
    {

                        ar
    >>b>>w;

                        data[i]
    =w+b;

                    }


            }


            
    else if(wChannel==2)             // 双音道

            
    {

                Ldata
    =new LONG[num/2];     // 左声道

                Rdata
    =new LONG[num/2];      // 右声道

                
    if(BytesPerSample==1)

                
    {

                    
    for(int i=0; i<num/2; i++)  // 一个声道的样本数为num/2, 左右声道交替

                    
    {

                        ar
    >>b;            

                        Ldata[i]
    =b-128;        

                        ar
    >>b;

                        Rdata[i]
    =b-128;

                    }


                }


                
    else if(BytesPerSample==2)

                    
    for(int i=0; i<num/2; i++)

                    
    {

                        ar
    >>w;

                        Ldata[i]
    =(SHORT)w;         // 无符号数转成有符号数

                        ar
    >>w;

                        Rdata[i]
    =(SHORT)w;

                    }


                
    else if(BytesPerSample==4)

                    
    for(int i=0; i<num/2; i++)

                    
    {

                        ar
    >>dw;

                        Ldata[i]
    =(LONG)dw;

                        ar
    >>dw;

                        Rdata[i]
    =(LONG)dw;

                    }


                
    else if(BytesPerSample==3)

                    
    for(int i=0; i<num/2; i++)

                    
    {

                        ar
    >>b>>w;

                        Ldata[i]
    =w+b;

                        ar
    >>b>>w;

                        Rdata[i]
    =w+b;

                    }


            }


            PlaySound(ar.GetFile()
    ->GetFilePath(), NULL, SND_ASYNC);  // 播放声音

        }


     

     

    视图类OnDraw函数添加如下代码:

    CRect rect;                // 客户区大小

        GetClientRect(
    &rect);        

        CPen gpen(PS_SOLID, 
    1, RGB(02500));          // 绿色笔

        pDC
    ->SelectObject(&gpen);

        
    if(pDoc->data!=NULL || pDoc->Ldata!=NULL)        // 数据非空时才画

        
    {

            
    float A=pow(2.08.0*pDoc->BytesPerSample-1);  // 将样本的高度映射到所需高度,

                                                           
    // 先算出样本的最大值

            
    if(pDoc->wChannel==1)                         // 单声道

            
    {  

                
    int x=0, y=rect.Height()/2;               

                
    while(x < rect.Width())         

                
    {

                    
    int min=INT_MAX, max=INT_MAX+1;      // 让min初始为最大的int, 让max初始化最小的int

                    
    // 一个象素x映射(样本数/客户区宽度)个样本点, 用其中最大最小值, 画一竖直的线段

                    
    for(int j=x*pDoc->num/rect.Width(); j<(x+1)*pDoc->num/rect.Width(); j++)

                    
    {

                        
    if(pDoc->data[j]<min)

                            min
    =pDoc->data[j];

                        
    if(pDoc->data[j]>max)

                            max
    =pDoc->data[j];

                    }


                    pDC
    ->MoveTo(x, y+(max*rect.Height()/2.0/A));

                    pDC
    ->LineTo(x, y+(min*rect.Height()/2.0/A));

                    x
    ++;

                }


                CPen pen(PS_SOLID, 
    1, RGB(20000));          // 客户区中间画一横线

                pDC
    ->SelectObject(&pen);

                pDC
    ->MoveTo(0, rect.Height()/2);

                pDC
    ->LineTo(rect.Width(), rect.Height()/2);    

            }


            
    else if(pDoc->wChannel==2)

            
    {

                
    // 在客户区上半部分画左声道, 原理同单声道,

                
    int x=0, y=rect.Height()/4;

                
    while(x<rect.Width())

                
    {

                    
    int min=INT_MAX, max=INT_MAX+1;

                    
    for(int j=x*pDoc->num/2/rect.Width(); j<(x+1)*pDoc->num/2/rect.Width(); j++)

                    
    {

                        
    if(pDoc->Ldata[j]<min)

                            min
    =pDoc->Ldata[j];

                        
    if(pDoc->Ldata[j]>max)

                            max
    =pDoc->Ldata[j];

                    }


                    pDC
    ->MoveTo(x, y+(max*rect.Height()/4.0/A));

                    pDC
    ->LineTo(x, y+(min*rect.Height()/4.0/A));

                    x
    ++;

                }


                
    // 在客户区下半部分画右声道

                x
    =0, y=3*rect.Height()/4;

                
    while(x<rect.Width())

                
    {

                    
    int min=INT_MAX, max=INT_MAX+1;

                    
    for(int j=x*pDoc->num/2/rect.Width(); j<(x+1)*pDoc->num/2/rect.Width(); j++)

                    
    {

                        
    if(pDoc->Rdata[j]<min)

                            min
    =pDoc->Rdata[j];

                        
    if(pDoc->Rdata[j]>max)

                            max
    =pDoc->Rdata[j];

                    }


                    gpen.DeleteObject();

                    gpen.CreatePen(PS_SOLID, 
    1, RGB(25500));

                    pDC
    ->SelectObject(&gpen);

                    pDC
    ->MoveTo(x, y+(max*rect.Height()/4.0/A));

                    pDC
    ->LineTo(x, y+(min*rect.Height()/4.0/A));

                    x
    ++;

                }


                
    // 画客户区中央横线

                CPen pen(PS_SOLID, 
    1, RGB(000));

                pDC
    ->SelectObject(&pen);

                pDC
    ->MoveTo(0, rect.Height()/2);

                pDC
    ->LineTo(rect.Width(), rect.Height()/2);

     

               

                pen.DeleteObject();

                pen.CreatePen(PS_SOLID, 
    1, RGB(00255));

                pDC
    ->SelectObject(&pen);

                
    // 画左声道横线

                pDC
    ->MoveTo(0, rect.Height()/4);

                pDC
    ->LineTo(rect.Width(), rect.Height()/4);

                
    // 右声道横线

                pDC
    ->MoveTo(03*rect.Height()/4);

                pDC
    ->LineTo(rect.Width(), 3*rect.Height()/4);

            }


        }

    OnDraw用到了pow函数, 添加头文件包含指令

    #include<cmath>      // double pow(double, double);

    展开全文
  • 本节将会介绍几种波形的输出方式,包含正弦波、方波、三角、锯齿、直流、以及任意波形,以便于读者通过程序控制通道OUT1、OUT2输出自己需要的波形。连接开发板并在项目文件夹redpitaya下创建...
  • 由于Verdi只能查看fsdb格式的波形,而vcs可以生成供DVE查看的vpd格式波形,如果想要输出fsdb格式的波形,我们就要额外在testbench中加入两个函数,并且用相应的命令进行编译。 1.首先了解一些vcs的常用命令: -cm ...

    由于Verdi只能查看fsdb格式的波形,而vcs可以生成供DVE查看的vpd格式波形,如果想要输出fsdb格式的波形,我们就要额外在testbench中加入两个函数,并且用相应的命令进行编译。

    1.首先了解一些vcs的常用命令:

    -cm line|cond|fsm|tgl|obc|path  设定coverage的方式
    +define+macro=value+      预编译宏定义
    -f filename             RTL文件列表
    +incdir+directory+         添加include 文件夹
    -I                 进入交互界面
    -l                 logfile文件名
    -P pli.tab             定义PLI的列表(Tab)文件
    +v2k                使用推荐的标准
    -y                 定义verilog的库
    -notice               显示详尽的诊断信息
    -o                 指定输出的可执行文件的名字,缺省是simv

    • nospecify            不对SPECIFY 模块进行时序检查和路径延时计算
    • notimingcheck          不进行时序检查;但是还是把path延时加入仿真中

    2.下面是我在run一个十分简单的例子:2-4译码器时用的命令:

    注:testbench中药加入两个函数:$fsdbDumpfile(“decoder.fsdb”);

    $fsdbDumpvars(0);

    vcs decoder_tb.v decoder.v -sverilog -fsdb -debug_all -l com.log

    如果不加-fsdb,编译时会报出上述两个函数的undefined错;

    如果不加-l 会报不能打开test.v的错(这个不知道为什么)。

    3.编译完成后,执行simv文件,即可。

    4.用verdi查看fsdb文件:

         命令:
    
                   verdi -sv -f filelist –ssf test.fsdb
    
         其中:
    
                   -sv: 表示 Verdi 软件 要支持systemverilog
    
                   -f filelist:  源代码的文件列表
    
                   -ssf test.fsdb:  指定fsdb文件
    
         filelist文件:
    

    在这里插入图片描述
    启动verdi后,在源代码页面按住鼠标中键选择线名拖到波形界面,向波形界面添加波形。

    5.为方便编译、仿真以及查看波形,可以将命令封装成makefile:
    在这里插入图片描述
    注意 对于看fsdb波形信号,debug_all选项是必须加的!!!!!!!!!!!!

    https://www.cnblogs.com/Edam-IC/p/8405656.html

    展开全文
  • 具体操作如下,先选择好深度,将信号抓到,在信号附近鼠标右击,会有一个选项create signaltap II list file,点击保存后,在工程目录下会自动产生一个.txt文件,里面便是你刚抓的波形,只是全部以数字的形式出现...
  • 22.2 波形音频 I

    2016-02-15 11:53:19
    摘录于《Windows程序...波形音频设备能够通过麦克风捕捉声音,将其转换成数字,存放在内存中或以.WAV 扩展名的波形文件的形式存储在磁盘上。随后,这些声音可以被重新播放出来。 22.2.1 声音和波形  在深入研究波
  • 波形图最上面菜单栏上【Tools】中【Data File Tool...】,并进行相应设置,最后如图所示,会导出对应SP文件。 通过Wincap软件,将SP文件拷贝到账户目录下 添加对应NPORT,“+”接对应端口,“-”...
  • verdi 几个常用小技巧

    千次阅读 2020-06-08 11:51:34
    1、波形文件保存.rc 使用Verdi定位问题,调出波形,为方便下次使用,按键shift+S可以将波形保存为xxx.rc格式文件,使用波形文件时,按快捷键r打开界面,选择波形 打开.rc,使用快捷键R(restore signal) 2、mark...
  • verdi的常用快捷模式

    2020-08-21 20:07:25
    nWave -f dut.fsdb 直接打开波形文件 两个光标,cursor和marker分别由左键和中间控制。 固定curson和marker距离:x 将cursor所在位置显示在屏幕中央:yy 添加标记时刻:shift+m 保存信号列表:shift+s 恢复...
  • "资源交互文件格式")格式的音频文件,MIDI的RMID文件和波形音频文件格式WAVE文件,其中在计算机领域最常用的数字化声音文件格式是后者,它是微软专门为Windows系统定义的波形文件格式,本文涉及到的声音文件所指的...
  • Verdi下nWave:2常用操作

    千次阅读 2019-12-27 09:34:53
    打开nWave后并加载fsdb波形文件后,使用快捷键G(Get signals)在窗口左下角,默认是All选项,意思是在窗口里显示所有信号,如果信号很多,你又只想看input,那么你就可以用input那个过滤项,只把input信号...
  • 目前比较常用的特征提取是提取心电信号的各波形间期长度、波峰高度等,本文是使用ARMA模型对心电信号进行处理,使用其系数来作为特征。一、心拍划分大多伴有异常波形的心律失常信号,通常都会具体表现在单个心拍中,...
  • WAV文件的使用

    2009-03-16 20:54:00
    WAV文件格式波形音频文件(*.WAV)是Microsoft为Windows设计的多媒体文件格式RIFF(The Resource Interchange File Format,资源交换文件格式)中的一种(另一种常用的为AVI)。RIFF由文件头、数据类型标识及若干块...
  • 录制成amr声音文件的实现代码

    千次阅读 2006-10-08 12:17:00
    如果你搜一下Nokia或NewLC论坛,会有很多问...其中wav波形文件一般比较大,由于手机资源有限,它使用范围不是很广。而midi和amr存储格式则比较小,应用比较广泛;Nokia默认录制声音文件保存为amr格式。需要熟
  • 摘要 1、CANoe工程新建 2、通过Trace工具查看交互报文内容 3、通过Logging保存日志文件 4、创建IG发送报文 5、通过Graphics界面抓取信号波形 6、加载cdd文件 7、过滤报文ID接收 8、其他
  • CANoe常用操作(CANoe系列其一)

    万次阅读 多人点赞 2019-05-04 17:27:56
    CANoe常用操作(CANoe系列其一)摘要1、CANoe工程新建2、通过Trace工具查看交互报文内容3、通过Logging保存日志文件4、创建IG发送报文5、通过Graphics界面抓取信号波形6、加载cdd文件7、过滤报文ID接收8、其他...
  • WAVE文件格式分析

    2017-04-16 19:14:39
    WAVE文件是计算机领域最常用的数字化声音文件格式之一,它是微软专门为Windows系统定义的波形文件格式(Waveform Audio),其扩展名为"*.wav",数据本身的格式为PCM或压缩型。最基本的WAVE文件是PCM(脉冲编码调制)...
  • wave文件 wav格式

    2014-09-11 11:04:35
    WAVE文件是计算机领域最常用的数字化声音文件格式之一,它是微软专门为Windows系统定义的波形文件格式(Waveform Audio),由于其扩展名为"*.wav"。   WAVE是录音时用的标准的WINDOWS文件格式,文件的扩展名...
  • XAudio2学习四之wave文件格式

    千次阅读 2016-02-29 17:30:09
    wave文件也称波形文件,是非常常用的音频格式。和很多文件一样,包括头信息和音频数据。
  • 该方法收集标准常用字号和字体,以及常用打印机打印文字,扫描采集,用改进直方图波形分析法处理图像,提取文字笔画总面积和笔画轮廓总周长等特征指标;再选定一种机型为参照,对各种机型相同字上述指标测量值...
  • 一,Windows支持两种RIFF... 在计算机领域最常用的数字化声音文件格式是后者,它是微软专门为Windows系统定义的波形文件格式(Waveform Audio),由于其扩展名为"*.wav",因而该类文件也被称为W...
  • WAVE文件是计算机领域最常用的数字化声音文件格式之一,它是微软专门为Windows系统定义的波形文件格式(Waveform Audio),由于其扩展名为"*.wav"。 WAVE是录音时用的标准的WINDOWS文件格式,文件的扩展...
  • CANoe常用操作(CANoe系列其一)摘要1、CANoe工程新建2、通过Trace工具查看交互报文内容3、通过Logging保存日志文件4、创建IG发送报文5、通过Graphics界面抓取信号波形6、加载cdd文件7、过滤报文ID接收8、其他...
  • 光学efl_光学常用术语

    2020-12-30 06:57:37
    EIA同步信号(EIA sync signal):在电子工业协会RS-170(单色图像)标准,RS-170A(彩色图像)标准、RS-312、RS330、RS-420及续后文件中规定,用于使扫描同步信号。电磁聚集(Electromagnetic focusing):使用...

空空如也

空空如也

1 2 3 4 5
收藏数 97
精华内容 38
关键字:

常用的波形文件