matlab怎么处理声⾳,⽤matlab处理⾳频⽂件吴秀波个人资料简介
⽤Audio Precision 2722来检测⾳频系统的频响曲线,其中有⼀种⽅法是利⽤被检测设备中声⾳⽂件发出的频率作为扫频信号源,检测系统的实际频响效果。其中对这个扫频信号是有较为严格的要求。具体要求(参考外部扫描规则设置External Sweep Rules)如下:
1. 在扫描的源1中,选择模拟信号分析仪的读数值A通道的频率作为信号源。 起始频率为20Hz,终⽌频率为22kHz,中间频率采⽤是对数⽅式增长。但是这些具体的频率是多少呢,需要通过外部规则来设定。因此,需要打开""按钮,做详细设定。
在 External Sweep Setting窗⼝,包括起始条件(Start),中间读数(Data)和终⽌条件(End)三个部分。分别包括了具体设定的数值,允许的读数误差。 在以下⼏种情况下,才可能开始扫描(AP 2700系列产品⽤户⼿册第423页)。
起始值设置:
1. 信号源的输出在起始值+/-误差范围内;信号强度要超过设定的阈值;设定的读数1-6都稳定;信号源1的读数稳定超过1s。这⼏个条件中,所有条件均必须满⾜,才能开始扫描。
2. 信号源的输出在起始值+/-误差范围或以上:信号强度要超过设定的阈值;设定的读数1-6都稳定;信号源1的读数稳定在误差范围内或超出误差范围的时间超过1s。
习惯一个人3. 任意设定的读数点:源1的信号是不相关信号;信号强度要超过设定的阈值;设定的读数1-6都稳定。在此情况下收集的数据可能超出设定的起始值和终⽌值的范围。
数据间隔问题:
1. 源1的读数稳定在前⼀读数加数据间隔上;
2. 要采集的信号读数必须⼤于或等于设定的读数阈值;
3. 设定的读数1-6都稳定;
4. 信号源1的读数稳定在误差范围内或超出误差范围的时间超过1s。
读数阈值设定:此数值的设定主要是⽤来排除误差⼲扰信号。对于低于设定值的信号不做处理。
终⽌条件设定:
陈奕迅 王菲
终⽌值及误差范围:当源1的测量读数在此范围时,会⾃动停⽌扫描。
从以上信息中得知,对于⽤作扫描信号的信号波形,并不是连续光滑的扫频曲线,⽽是基本上以1秒为单位的步长阶梯,并且这些频点是以对数频率步进。如果要扫描的范围是22Hz-22000Hz,则起始范围⽐1000,常⽤对数值为3。如果划分为30个频点,每个频点步长为常⽤对数0.1。如果划分为120个频点,则步长为0.025。如果更进⼀步,划分到150个频点,则步长为0.02。每个频点的最短时间为1s。假设其为1.1s,则需要扫描165s,外加10s的1kHz标准信号,则整个扫描过程最少需要175s才能完成。
在matlab上,可以⽤以下代码实现。
%以下程序中⽣成正弦波并播放。
Fs = 192000; % 采样频率
%写10s 1kHz数据
T = 10; % 时间长度
n = Fs*T; % 采样点数f = 1000; % 声⾳频率
nBitSize = 24; %量化精度(位深度)
y = sin(2*pi*f*T*linspace(0,1,n+1));
%sound(y,Fs);  %播放⾳频数据
nStartFreq =20;  %起始频率
nEndFreq=22000;  %终⽌频率
nSteps=160;    %共扫描160个数据点
谢娜和张杰年龄
nLastT=1.1;      %每个频点延时1.1秒
nCount = Fs*nLastT;
nStepLog = log10(nEndFreq/nStartFreq)/nSteps; %频率增加的对数步距
for (nFreqLog =0:nSteps-1)
fFreq = nStartFreq*10^(nFreqLog*nStepLog)            %实际扫描频点
狗磊因为什么事进去的
y1=sin(2*pi*fFreq*nLastT*linspace(0,1,nCount+1)); %⽣成对应频率的正弦波数据,频率为计算的频点,时间1.1s    y=[y,y1];                  %⽣成的数据与前⾯的波形数据合并end
filename = 'd:\testfiles\Sweep_192K_24bit.wav';
audiowrite(filename, y, Fs, 'BitsPerSample',nBitSize,'Comment','Sweep_192K_24bit'); %保存声⾳⽂件。
info = audioinfo(filename);
info              %显⽰⾳频⽂件的主要信息
msgbox('程序运⾏结束。');
程序运⾏后的显⽰结果如下(matlab 8.01 64位版本,运⾏时间7s):
info =
Filename: 'D:\TestFiles\Sweep_192K_24bit.wav'
CompressionMethod: 'Uncompressed'
NumChannels: 1
SampleRate: 192000
TotalSamples: 35712161
Duration: 186.0008
Title: []
Comment: 'Sweep_192K_24bit'
Artist: []
BitsPerSample: 24
使⽤matlab的最⼤好处在于读取和保存声⾳⽂件⾮常⽅便。⽬前使⽤audioread, audiowrite 和 audioinfo函数替代了早期的wavread和wavwrite等函数,把⽀持的⾳频⽂件的格式扩展到 WAV, OGG, FLAC,M4A,ALC等格式,全⾯⽀持24bit,32位,64位量化,以及各种采样率的归⼀化数据,为⾳频⽂件的处理提供了极⼤的灵活性。
使⽤ Audition 对该⽂件的频谱做分析如下:
整体频谱范围在20-22kHz,前⾯⼀段10s 1KHz。
局部放⼤后,可以看到每个频段的持续时间1S。在两个不同频点的连接处,可以看出频谱很⼴。
对波形数据做局部放⼤,可以看出,因为波形数据不连续,导致其频谱⾮常负载。
通过 matlab的强⼤运算能⼒,可以对⾳频数据的质量做分析。以下的程序段⽤于将⾳频数据⽂件读到
系统中,然后进⾏FFT,获取信号的频谱。
%⽤fft⽅法分析 Wave波形⽂件的频谱
小杰音乐
%y 为⾳频数据的存储数组,Fs为⾳频数据的采样率
%Pyy ⽤于保存⾳频的归⼀化幅度,Pyy_DB是转换为dBV以后的数值。
%info⽤来获取⾳频⽂件的详细信息,nBitSize是⾳频⽂件的采样率。
%nNormal ⽤于做归⼀化使⽤的常数,等于2^nBitSize。
%sigLength是⾳频⽂件的总采样个数,halfLength是总采样数的⼀半值。
%f是⽤于显⽰频率时的具体频点值。
%>>>>>>>>>>>###clear;          %清理当前内存变量clc;          %清理命令窗⼝filename='D:\testfiles\1kHz_Sine_192kHz_24bit_2ch.wav';
[y,Fs]=audioread(filename);%读数据⽂件info = audioinfo(filename); %获取⾳乐⽂件信息nBitSize = info.BitsPerSample;%获取⽂件中采样深度
nNormal = 2^nBitSize;      %做幅度归⼀化时的最⼤值
y=y(:,1);                  %仅使⽤双声道数据中的第⼀列(左声道数据)sigLength = length(y);      %获取数组长度
%Y1 = y.*hanning(sigLength); %使⽤Hanning窗变换?操作失败,暂时去掉。
%完成FFT及获取幅度值,以及幅度值的对数表⽰法(dBV)Y=fft(y,sigLength);        %做标准FFT变换Pyy =
abs(Y)*2/sigLength/nNormal;  %求取变换结果的幅值部分,并做归⼀化处理Pyy_DB = 10*log10(Pyy);            %取常⽤对数,变成dBV单位。
%以下处理画图部分
halflength = floor(sigLength/2);    %仅使⽤半长度做显⽰
f=Fs*(0:halflength)/sigLength;      %⽣成索要⽤的频点
semilogx(f,Pyy_DB(1:halflength+1));      %画x轴对数曲线
title('1K-192kHz-24bit-2CH正弦波频谱'); %标题
xlabel('频率(Hz)');                  %x轴标记
ylabel('dBV');
grid on;                        %打开⽹格
msgbox('Done');                %提⽰结束
实际运⾏的结果如下:
直接⽤Audition ⽣成的192KHz,24bit采样的正弦波,其频谱如下: