用步进正弦激励法测量计算机声卡输出输入幅值频响函数


(2019年秋季学期工程振动试验分析最后一次实验报告)

实验目的

通过对计算机声卡系统的实测加深对频响函数的理解;
对声音振动及测量有直观了解;
对计算机声卡系统的频响特性有直观的认识。

实验内容

用声卡发出的步进正弦输出信号再由声卡通过音频线直接采集为输入信号,由此分析声卡的幅值的频率特性曲线

实验步骤

将计算机声卡的麦克风输入口和耳机或音箱输出口用音频线连上。
利用MatLab控制声卡发出正弦信号,信号幅值应控制在[-1,1]之间,以防止信号输出饱和。建议信号幅值取0.4V左右。
利用计算机的录音机软件记录此正弦信号。并存成数据文件。计算出或平均出记录信号的幅值。
保持正弦信号输出的幅值不变,改变正弦信号的频率,用计算机的录音机软件记录相应的数据文件。
分析记录信号的幅值。用记录信号的幅值除以设定的输出信号的幅值,例如0.4V,即为计算机声卡系统在各离散频率点的频响函数值。

实验过程

实验对象

本次试验采用台式机,具体型号为戴尔灵越3670
调节windows10声音为最大100

分析设置

设置采样频率fs=22050Hz
奈奎斯特频率fnyq=11025Hz
故设置,分析频率为:40Hz~10000Hz,其间间隔为20Hz

代码分析

实验用代码如下,相关分析写在注释中:

close all
clear
clc

tf=0.15;%和录音时间成正比
ts=0.1;%由于声音产生后需要一段时间来达到稳态,所以需要一段等待时间
fs=22050;%采样频率
% fs=44100;%采样频率
amp0=0.4;%信号源幅值
bits=16;%声音质量
dt=1/fs;%采样间隔
t=0:dt:(tf*2+ts);%声音总共需要保持的时间

R=audiorecorder(fs,bits,1) ;

frq_array=20:20:10000;%产生声音的频率集合
amp_array=zeros(1,length(frq_array));%用于记录声音幅值

for i=1:length(frq_array)
    
    frq=frq_array(i);
    
    sound(amp0*sin(frq*2*pi*t),1/dt,bits);%产生声音
    
    pause(ts);%等待声音进入稳态
    
    record(R);%开始录音
    pause(tf*2);%录音中,等待
    stop(R);%停止录音
    
    wave=getaudiodata(R);%得到录音结果
    temp=rms(wave);%求录音均方根值
    select1=find(wave>temp);%选取信号大于均方值的点,选取有效信号
    select2=select1(end);%选取最后一个值大于均方值的点作为结束信号
    select3=max(select2-fs*0.1,1);%选取0.1s之前的开始序号,max函数用于防止该频率信号没有被采集到导致程序终止
    wave=wave(select3:select2);%信号时域截取,共0.1s,由于频率均为10Hz的整数倍,防止了栅栏效应
    
    [f,amp]=myfft(fs,wave);%自己写的FFT,可以返回幅值
    
    figure(1)%时域
    plot((1:length(wave)).*dt,wave);
    hold on;
    
    figure(2)%频域信号幅值谱,已经除以信号源幅值
    plot(f,amp./amp0);
    hold on;
    
    amp_array(i)=max(amp);
    
end

figure(1)
xlabel('t/s');
ylabel('output');
axis([-inf,inf,-inf,inf]);
grid on;

figure(2)
xlabel('Frequency/Hz');
ylabel('Amplitude');
axis([-inf,inf,-inf,inf]);
grid on;

figure(3)%频域传递函数幅值,除以了信号源幅值
plot(frq_array,amp_array./amp0);
xlabel('Frequency/Hz');
ylabel('Amplitude');
axis([-inf,inf,-inf,inf]);
grid on;

figure(4)%平滑处理
amp_smooth=zeros(1,length(frq_array));
for i=2:length(frq_array)
    if amp_array(i)>amp_array(i-1)*0.9
        amp_smooth(i)=amp_array(i);
    else
        amp_smooth(i)=amp_array(i-1);
    end
end
plot(frq_array,amp_smooth./amp0);
xlabel('Frequency/Hz');
ylabel('Amplitude');
axis([-inf,inf,-inf,inf]);
grid on;


function [f,y]=myfft(fs,array)
l=length(array);
temp=fft(array);%fft
temp=abs(temp/l);%求幅值
y=temp(1:l/2+1);%采样定理
y(2:end-1)=2*y(2:end-1);%幅值乘二,得单边谱
f=fs*(0:(l/2))/l;%频域采样
end

实验结果

得到的时域图
在这里插入图片描述

得到的频域图(已经除以信号源频率)
在这里插入图片描述
传递函数幅值(已经除以信号源频率)
在这里插入图片描述
经过平滑处理后的频响函数
在这里插入图片描述

可以发现,在几个频率点,频响函数接近0。这是因为设备错误的不可抗力导致没有采集到有效信号导致的。实验代码里也有响应的操作来防止由于没有采集到信号造成的实验终止。

改变实验条件

为扩大实验分析频响函数的频率范围,改变如下设置:
采样频率:fs=44100Hz
分析频率:10~20000Hz,其间间隔为10Hz

实验结果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

可以发现,在400~20000Hz的频率范围内,声卡的频响函数变化也符合之前试验结果的特征。

结论

本实验利用Matlab测量了台式机戴尔灵越3670的声卡的幅频响应。结果显示,在4000~10000Hz的频率范围内,声卡的频响函数变化较为平稳;在小于4000Hz频段,频响函数幅值随着频率不规则波动;在大于8000Hz的频段,频响函数幅值随着频率增大而减小。

实验小结

本次实验利用了matlab实现了声卡频响函数的测量,是对于matlab使用技巧的一次很好的训练。
此外,实验指导书中的matlab函数wavread在matlabR2018b中似乎已经失效,望周知。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值