matlab 做音频文件(WAV格式)的频谱图程序 以及做时域波形图的程序

matlab 做音频文件(WAV格式)的频谱图程序 以及做时域波形图的程序,第1张

%你好,该程序读mywavwav文件,然后显示频谱以及波形。注意,mywavwav文件不要太长,否则运算会很慢。

[y,Fs,bits]=wavread('mywavwav');%读出信号,采样率和采样位数。

y=y(:,1);%我这里假设你的声音是双声道,我只取单声道作分析,如果你想分析另外一个声道,请改成y=y(:,2)

sigLength=length(y);

Y = fft(y,sigLength);

Pyy = Y conj(Y) / sigLength;

halflength=floor(sigLength/2);

f=Fs(0:halflength)/sigLength;

figure;plot(f,Pyy(1:halflength+1));xlabel('Frequency(Hz)');

t=(0:sigLength-1)/Fs;

figure;plot(t,y);xlabel('Time(s)');

/

// 载波比选为N=24,调制比M=Uc/Ur=1,晶振频率12M

// 正弦波频率50Hz

// 高电平的宽度Tpw = Tt/2(1+Msimwt)

// 低电平的宽度Tpw = Tt/2(1-Msimwt)

// Tt周期

// T2是产生SPWM波形,并从P1^1输出,用导线连接到P34作为测试频率使用。

// T1工作在定时方式1,定时1s

// T0工作在计数方式,对输入的脉冲进行计数,溢出产生中断。

// 16位计数器最大值是65536,1s内可能会产生多次溢出,所以在中断处理程序对中断的次数进行

// 计数。1s到后,将中断的计数器里的计数值取出进行综合处理,处理后的数据送显示。

//信号频率的计算方法:

// T0工作在计数方式,假设1s内溢出C1次,最后未溢出的计数值是C2,则频率公式为:

// F=C12^16+C2 = C165536+TH0256+TL0)

//使用12MHz时钟,测量的最大范围是不大于500KHz。

/

#include "reg52h"

#define uchar unsigned char

#define uint unsigned int

uchar disp[8]={0,0,0,0,0,0,0,0};

uchar FreStr[]="Friquency is:";

uchar T0count,T1count;

uchar code x[]={66,38,26,89,15,97,7,102,2,103,1,102,2,

97,7,89,15,78,26,66,38,38,66,26,78,15,

89,7,97,2,102,1,103,1,103,2,102,7,97,15,

89,26,78,38,66};

uchar ky,kc,count=255;

sbit L1=P1^1;

void delayms(uchar ms)

{

uchar i ;

while(ms--)

{

for(i = 0 ; i < 120 ; i++) ;

}

}

//LCD定义开始

//以下三个是定义LCD的引脚

sbit lcden=P0^5;

sbit lcdwrite=P0^6;

sbit lcdrs=P0^7;

//延时程序

void delay(uint z)

{

uint x,y;

for(x=z;x>0;x--)

for(y=110;y>0;y--);

}

//lcd的写指令

void write_com(uchar com)

{

lcdrs=0;

lcden=0;

P2=com;

delay(5);

lcden=1;

delay(5);

lcden=0;

}

//lcd的写数据

void write_data(uchar da)

{

lcdrs=1;

lcden=0;

P2=da;

delay(5);

lcden=1;

delay(5);

lcden=0;

}

//初始化

void Lcd_init()

{

lcdwrite=0;

lcden=0;

write_com(0x38); //162显示,57点阵,8位数据

write_com(0x0c);//显示开,关光标

write_com(0x06); //移动光标

write_com(0x01);//清除LCD的显示内容

}

//LCD定义结束

//计算频率值

void calc()

{

uchar i;

long frequency;

frequency=(T0count256+TH0)256+TL0;

for(i=7;i>0;i--)

{

disp[i]=frequency%10;

frequency=frequency/10;

}

disp[0]=frequency;

}

void init()

{

T0count=0;

T1count=0;

TH0=0;

TL0=0;

}

void main()

{

uchar dis;

init();

Lcd_init();

TMOD=0x15;

TH1=(65536-5110592/12)/256;

TL1=(65536-5110592/12)/256%10;

ET1=1;

ET0=1;

EA=1;

TR1=1;

TR0=1;

//以下四句的作用是在P11引脚上形成1000Hz的脉冲,用导线连接到P34作为测试用。将其中

//高8位和低8位的初始值更改后可输出不同频率的脉冲。

T2MOD = 0x02;

TH2=255-x[ky];

TL2=255-x[ky];

ET2=1;

EX0=1;

TR2=1;

L1=1;

write_com(0x80);

for(dis=0;dis<12;dis++)

write_data(FreStr[dis]);

while(1)

{

write_com(0xC0);

for(dis=0;dis<8;dis++)

write_data(disp[dis]+0x30); //显示频率

}

}

//计算输入脉冲的次数

void time0() interrupt 1

{

T0count++;

}

//计算1s时间

void time1() interrupt 3

{

TH1=(65536-5110592/12)/256;

TL1=(65536-5110592/12)/256%10;

if(T1count==20)

{

calc();

init();

}

else T1count++;

}

//这是产生SPWM波形、

void M() interrupt 5

{

TH2=255-x[ky];

TL2=255-x[ky];

kc++;

if(kc==count)

{

kc=0;

L1=~L1;

ky++;

if(ky==49) ky=0;

}

}

//这是使用外部中断0可以调整输出波形的频率

void MM() interrupt 0

{

delayms(300);

if(INT0==0)

{

count=count-5;

if(count==0) count=255;

}

}

根据反演时使用信息的不同,反演方法可以分为走时/相位反演、振幅反演、全波形反演三大类。利用波场运动学信息反演出来的结果反映的是大尺度的地下速度模型的宏观特征,对于理想观测系统,它的分辨率可达到Fresnel带数量级。利用完整波场信息反演的方法则具有精确刻画模型细节的潜力,对于理想观测系统,反演结果的分辨率可达到波长数量级(卞爱飞,2010)。

全波形反演方法利用叠前地震波场的运动学和动力学信息,重建地下速度结构,具有揭示复杂地质背景下构造与岩性细节信息的潜力。根据研究需要,全波形反演既可以在时间域进行也可以在频率域实现。

一般假定 时间序列 为 y[t], 离散数据 个数 为 n

计算波形个数,通常要假定一条基线,基线以上为峰,基线以下为谷。

通常用时间序列平均值为基线 0。

然后 用 上跨 0 的方法判断 “进峰”,或下跨 0 的方法判断 “进谷”。

例如,海浪。

int n_wave(double y, int n)

{

double mean=00;

int N=0;

for (i=0;i<n;i++) mean = mean + y[i];

mean = mean / n; //得平均值

for (i=0;i<n;i++) y[i] = y[i] - mean; // 扣去平均值

for (i=0;i<n-1;i++){

if (y[i+1] > 0 && y[i] <= 0 ) N++; // 上跨 0 则得1个峰

}

return N;

}

==================

工程实用时,还可以考虑一个 或值 dy (或字 是 门字头,里面一个 或),

也就是 y > dy 才算 进峰,y < -dy 才算 进 谷。-dy 到 dy 之间 处理为 0 。

上跨0和下跨0得到的波的个数在波形很不规则时会有一点差。海浪波谱分析里一般以下跨0为准。

像你这种波形像似风增水和波浪的叠加,也可以 用 滤波方式,消去 倾斜趋势 后再统计峰的个数。

另外,像你这种波形,波形尾部 的 “坏数据”需要截 去后,再作统计计算。

这些都是锦上添花。

目前,用物探方法实现采煤工作面高精度建模的主要是北京中矿大地地球探测工程技术有限公司。该公司研发了矿井地震全波形反演技术,被中国煤炭工业协会鉴定为国际领先水平。

地震全波形反演(FWI)是一种高精度、高分辨率的地下介质物性参数反演方法。由于FWI利用了地震记录中全部的运动学和动力学信息,因而具有精细刻画复杂地质构造的能力,适合于对地层进行透明三维地质成像。

基于地震全波形反演成果,结合钻孔、巷道实测素描等多源数据融合分析,可以构建综采工作面精准静态三维地质模型,实现综采工作面地质透明化,为智能煤矿透明地质保障系统提供技术支撑,再不明白自己去百度下。

给你看下程序吧,C语音: if(state==1)//正弦波

{for(k=0;k<100;)

{

if(P1!=0xf0)

{ sweep();}

if(FLAG==1)

{out=sin[k];

FLAG=0;

//P2_4=0;

//delay(255);

P0=out;

k++; }

} }

else if(state==2) //三角波

{for(k=0;k<100;)

{

if(P1!=0xf0)

{ sweep();}

if(FLAG==1)

{out=shn[k];

FLAG=0;

//P2_4=0;

//delay(255);

P0=out;

k++; }

} }

else if(state==3) //方波

{for(k=0;k<100;)

{

if(P1!=0xf0)

{ sweep();}

if(FLAG==1)

{out=fan[k];

FLAG=0;

//P2_4=0;

//delay(255);

P0=out;

k++; }

} }

以下是对Visual Modflow和FEFLOW区别的一些浅薄的认识,和大家共同探讨。这里的Visual Modflow指的是目前大家常用的版本,不含Visual Modflow中MODFLOW-SURFACT模块。

Visual Modflow和FEFLOW都是当前世界上十分流行的可用于模拟三维地下水流和溶质运移模拟评价专业软件系统,属商业软件。它们都具有直观的、强有力的图形交互界面,模型剖分、输入参数和模拟结果,都可以用图形显示,并支持三维可视化和,做到了真正的人机对话,在许多行业和部门内得到了广泛的应用。但同时,它们之间却存在着许多差别,各有千秋:

(1)从软件功能上看,FEFLOW要比Visual MODFLOW更为全面一些,FEFLOW除了可以模拟Visual Modflow所能模拟的二维、三维饱和流状态的水流和溶质运移问题之外,还可以模拟多层自由表面含水系(包括滞水模拟)、热转递、可变密度流场(盐水或海水入侵问题)以及非饱和带流场及物质运移问题。

(2)从数值法的计算原理上,Visual Modflow采用的是有限差分法,而FEFLOW采用的是有限单元法。

(3)从离散化方面来说,由于Visual Modflow采用的是有限差分法,所以对所模拟的地质体采用矩形网格进行剖分,这种网格的优点在于,用户易于准备数据文件,便于输入文件的规范化,但是,当需要在所关注的地点附近(比如井附近)要增加计算单元的密度,就必须同时对经过该点附近区域的所有的行和列都进行加密,这样使得计算量大大增加。而FEFLOW不存在这个问题,由于其采用的是有限单元法,其剖分单元的形状可以是灵活多变(可以是三角形、也可以是矩形),一般采用三角形剖分,加密的时候,可以只对感兴趣的地方加密,相比Visual Modflow来讲,减少了运算量。用三角形剖分的另一个好处是,在刻画模拟区的外部边界时,可以利用三角形的边很好地控制外边界范围,这样刻画出来的边界比用Visual Modflow刻画出的外部边界要精确。以上两点通过两个软件的实例便可看出。另外,有限差分法对于处理复杂地质体中的地下水三维渗流场模拟方面存在着不足,没有有限元三角剖分灵活多变。

(4)FEFLOW具备地理信息系统数据接口,可以充分利用已有的 ARC/INFO GIS地理信息系统数据产生有限单元网,设置边界条件和参数。

(5)Visual Modflow采用的是模块化结构,在软件输入 *** 作过程便体现了这一点,如边界条件里面的定水头边界、河流边界、截渗墙边界、排水沟边界、补给边界和蒸发边界等,而FEFLOW的边界条件是按照一类、二类、三类和井流边界划分的。这两种形式各有优缺点,模块化结构对常见的几类边界进行了分类,用户可根据问题直接选择该边界模块进行输入编辑 *** 作,十分方便,但遇到特殊水文地质问题时就显得不足;FEFLOW中边界问题的分类采取了广义的边界条件分类,因此在处理水文地质边界条件时就非常的灵活,但是这种过于集中的输入方式也给输入工作带来了不便,比如源汇项的输入过于集中,用户需要对其数据进行整理或者预处理才能输入;另外,在非稳定流模拟中,对于蒸发输入的 *** 作在Visual Modflow中可以很容易实现,但是在FEFLOW中却要通过FEFLOW的二次开发工具IFM模块编程来实现。

(6)在混合井的模拟方面二者都存在不同程度上的不足。混合井流是在生产过程中十分常见的一种地下水开采方式。但混合井流的模拟一直是MODFLOW的一个缺陷。尽管MODFLOW建议“多层井的流量必须以某种形式人为地分配给每一单层,……把井流量按每一层的导水系数大小分配,即 ”,其中 和 分别为第 层流量和总(井口)流量,Ti和求和公式T分别为第i层导水系数和总导水系数。但实质上,这种方法是不妥的,它不是模拟,而是“处理”,一种与机理不符的“处理”。因此这个问题应引起地下水流数值模拟工作者的重视。FEFLOW以前的版本中在处理该问题时,也有类似的不足,其处理方法是在同一点上布置多口井(每个井开采的层位不同)来实现混合井开采问题,不过在新的Version53版本中已有改进,是否完善还有待进一步验证。(7)干涸单元问题。在Visual Modflow的计算过程中,如果计算水头低于该计算单元之地面标高,该计算单元则处于非饱和状态。这时,Visual Modflow并不考虑该计算单元在非饱和态下的渗透系数,而是将这个计算单元列为“干涸计算单元”(Dry cell),并将其导水系数赋值为零。一旦一个计算单元变为干涸单元,他就将被重新定义为不透水或非活动单元计算,从而被摒除出以后的模型计算。计算结果也可能因为干涸计算单元的出现而受到影响。所以,Visual Modflow中对于干枯单元的处理方法还不够完善。为了克服88年版MODFLOW中计算单元“一旦变干就永不能恢复”的问题,美国地调局的McDonald等人于1992年推出了一个新的子程序包,称为BCF2(Block Centered Flow Package),允许干涸单元重新成为有效的计算单元,即出现了重新变湿(Rewetting)选项,但是其结果并不理想,虽然干涸单元格可以得已重新变湿,但是又造成了运算不易收敛的问题。

而在FEFLOW中,由于其没有采用这种处理方式,也就不存在这一问题。

(8)模型文件的保存形式不同。在Visual Modflow中,一个模型往往生成很多文件,模型构成数据及计算结果分别被保存成不同的文件类型,如各层标高文件保存为VMG文件,边界及参数保存在VMP文件中,井文件保存为VMW文件,输出结果水头数据保存为HDS文件,降深数据保存为DDN文件,水均衡数据保存为ZOT文件等,你可以直接对这些文件 *** 作,或者利用这些文件构建模型等。在FEFLOW中,一个模拟问题全部保存在一个fem文件内,模拟结果也保存为一个文件(DAC文件)。

(9)在利用Visual Modflow模拟非稳定流问题时,模拟计算可以随时停止、暂停,但若问题没有模拟结束就无法显示模拟结果。而在FEFLOW中,非稳定流模拟计算可以随时暂停,以便用户显示和分析中间模拟结果,并且工作窗口可以实时显示地下水非稳流场,温度场及污染物迁移模拟结果。

以上是对两软件的一些比较,大家可以根据自己需要学习或者选用这两款软件,当然,还有其它类似的一些软件,如Processing Modflow、GMS、Visual Groundwater等等。但是,需要注意的是,软件只是我们解决模拟问题的工具而以,最重要的还是对基础理论把握和对实际问题的正确认识,只有正确地认识和分析各类水文地质问题,才能做好水文地质模拟工作。

以上就是关于matlab 做音频文件(WAV格式)的频谱图程序 以及做时域波形图的程序全部的内容,包括:matlab 做音频文件(WAV格式)的频谱图程序 以及做时域波形图的程序、基于STC51系列单片机的SPWM波形实现,程序如何编写急急急急、什么是全波形反演等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/9585268.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-29
下一篇2023-04-29

发表评论

登录后才能评论

评论列表(0条)

    保存