声管模型GUI仿真
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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);