声管模型GUI仿真

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

声管模型的GUI仿真

学院:机电与信息工程学院

学科:电子信息科学与技术

班级:

姓名:

学号:

一、设计要求:

钢性绝热管腔(声管)内的气柱都有特定的共振频率,不同直径的声管连接时,接口会有反射,多级相连就会合成出各种语音。

根据具有反射的多级声管波动方程,用GUI实时展示,不同声管数,不同尺寸的级联声管的合成效果。

二设计思路:

利用GUI设计界面以及必要的函数实现各项功能。建立两个坐标轴对象,模拟声管模型和声波频谱,建立4个可编辑文本框,用来输入声管的半径,建立3个按钮,分别实现声管模型,声音频谱和发声功能。

三、设计过程:

(1)建立两个坐标轴对象,用于显示声管的模拟图形和声音频谱。

(2)建立四个可编辑文本框,用于输入声管半径。

(3)建立三个按钮,用于画声管模拟图形和声音频谱以及发声。

(4)建立若干静态文本标签,用于提示功能。

(5)编写代码段,运行测试。

四、结构说明:

1、界面设计图如图一

图一

具体属性设置:两个坐标轴对象tag分别为axes1,axes2;四个可编辑文本框tag分别为l1,l2,l3,l4,初始值3,4,5,3;三个按钮tag依次为anniu1,1nniu2,1nniu3,名称分别为图形,波形,声音。

2、运行图如图二

图二

五、程序代码

可编辑文本框部分(默认值设置):

function l1_CreateFcn(hObject,eventdata,handles)

set(gcbo,'string','3')

function l2_CreateFcn(hObject,eventdata,handles)

set(gcbo,'string','4')

function l3_CreateFcn(hObject,eventdata,handles)

set(gcbo,'string','5')

function l4_CreateFcn(hObject,eventdata,handles)

set(gcbo,'string','3')

程序1:画声管模型

function anniu1_Callback(hObject,eventdata,handles)

f1=str2double(get(handles.l1,'string'));

f2=str2double(get(handles.l2,'string'));

f3=str2double(get(handles.l3,'string'));

f4=str2double(get(handles.l4,'string'));

% 提取f1,f2,f3,f4

x=-18:0.01:1;

f=(uCT(4.25+x)-uCT(x))*f1+(uCT(8.5+x)-uCT(x+4.25))*f2+(uCT(12.75+x) -uCT(x+8.5))*f3+(uCT(17+x)-uCT(x+12.75))*f4;

% 声管模型方程

axes(handles.axes1)

plot(x,f),grid off

% 画图 §

axis([-181-19]);

程序2:画声音频谱

function anniu2_Callback(hObject,eventdata,handles)

f1=str2double(get(handles.l1,'string'));

f2=str2double(get(handles.l2,'string'));

f3=str2double(get(handles.l3,'string'));

f4=str2double(get(handles.l4,'string'));

% 提取f1,f2,f3,f4

a1=2*pi*f1^2;

a2=2*pi*f2^2;

a3=2*pi*f3^2;

a4=2*pi*f4^2;

% 计算面积 ¨ ¨

r0=-0.97;

r1=(a2-a1)/(a2+a1);

r2=(a3-a2)/(a3+a2);

r3=(a4-a3)/(a4+a3);

r4=0.97;

% 计算r

b1=r0*r1+r1*r2+r2*r3+r3*r4;

b2=r0*r2+r2*r4+r1*r3+r0*r1*r2*r3+r0*r1*r3*r4+r1*r2*r3*r4;

b3=r0*r3+r1*r4+r0*r1*r2*r4+r0*r2*r3*r4;

b4=r0*r4;

%Z ¨

g=(1+r0)*(1+r1)*(1+r2)*(1+r3)*(1+r4);

z=0:1:100;

Ug=z/(z-1);

% Z ¨ ¨

Ul=Ug*(g*z.^(-2)/(1+b1*z.^(-1)+b2*z.^(-2)+b3*z.^(-3)+b4*z.^(-4))); % ¨ ¨ Z ¨

A=g/sqrt((b1^2)-4*b2);

B1=(-b1+sqrt(b1^2-4*b2))/2;

B2=(-b1-sqrt(b1^2-4*b2))/2;

dt=0.001;t=-20:dt:2.5;

y=square(2*pi*t,1)/2;

h=A*(B1.^t-B2.^t);

f=conv(y,h)*dt;n=length(f);tt=(0:n-1)*dt-2;

%

axes(handles.axes2);

plot(tt,f)

grid on

% 画图

程序3:发出声音

function anniu3_Callback(hObject,eventdata,handles)

f1=str2double(get(handles.l1,'string'));

f2=str2double(get(handles.l2,'string'));

f3=str2double(get(handles.l3,'string'));

f4=str2double(get(handles.l4,'string'));

a1=2*pi*f1^2;

a2=2*pi*f2^2;

a3=2*pi*f3^2;

a4=2*pi*f4^2;

r0=-0.97;

r1=(a2-a1)/(a2+a1);

r2=(a3-a2)/(a3+a2);

r3=(a4-a3)/(a4+a3);

r4=0.97;

b1=r0*r1+r1*r2+r2*r3+r3*r4;

b2=r0*r2+r2*r4+r1*r3+r0*r1*r2*r3+r0*r1*r3*r4+r1*r2*r3*r4;

b3=r0*r3+r1*r4+r0*r1*r2*r4+r0*r2*r3*r4;

b4=r0*r4;

g=(1+r0)*(1+r1)*(1+r2)*(1+r3)*(1+r4);

z=0:0.01:100;

U2=(z/(z-1))

%输入的冲击波

Ul=U2*(g*z.^(-2)/(1+b1*z.^(-1)+b2*z.^(-2)+b3*z.^(-3)+b4*z.^(-4))); %Z域公式

k=-100:100;

uk=rand(1,6000);

A=[00g];

B=[(b1-1)10(b2-b1)(b3-b2)(b4-b3)(-b4)];

%查分方程的系数

t=uk;fs=2000;

y=filter(A,B,t);

相关文档
最新文档