找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 20005|回復(fù): 1
收起左側(cè)

用matlab處理音頻文件

[復(fù)制鏈接]
ID:108531 發(fā)表于 2016-3-12 21:01 | 顯示全部樓層 |閱讀模式
用Audio Precision 2722來檢測音頻系統(tǒng)的頻響曲線,其中有一種方法是利用被檢測設(shè)備中聲音文件發(fā)出的頻率作為掃頻信號源,檢測系統(tǒng)的實(shí)際頻響效果。其中對這個(gè)掃頻信號是有較為嚴(yán)格的要求。具體要求(參考外部掃描規(guī)則設(shè)置External Sweep Rules)如下:

1. 在掃描的源1中,選擇模擬信號分析儀的讀數(shù)值A(chǔ)通道的頻率作為信號源。 起始頻率為20Hz,終止頻率為22kHz,中間頻率采用是對數(shù)方式增長。但是這些具體的頻率是多少呢,需要通過外部規(guī)則來設(shè)定。因此,需要打開"External Rules..."按鈕,做詳細(xì)設(shè)定。
  
在 External Sweep Setting窗口,包括起始條件(Start),中間讀數(shù)(Data)和終止條件(End)三個(gè)部分。分別包括了具體設(shè)定的數(shù)值,允許的讀數(shù)誤差。 在以下幾種情況下,才可能開始掃描(AP 2700系列產(chǎn)品用戶手冊第423頁)。

起始值設(shè)置:
1. 信號源的輸出在起始值+/-誤差范圍內(nèi);信號強(qiáng)度要超過設(shè)定的閾值;設(shè)定的讀數(shù)1-6都穩(wěn)定;信號源1的讀數(shù)穩(wěn)定超過1s。這幾個(gè)條件中,所有條件均必須滿足,才能開始掃描。
2. 信號源的輸出在起始值+/-誤差范圍或以上:信號強(qiáng)度要超過設(shè)定的閾值;設(shè)定的讀數(shù)1-6都穩(wěn)定;信號源1的讀數(shù)穩(wěn)定在誤差范圍內(nèi)或超出誤差范圍的時(shí)間超過1s。
3. 任意設(shè)定的讀數(shù)點(diǎn):源1的信號是不相關(guān)信號;信號強(qiáng)度要超過設(shè)定的閾值;設(shè)定的讀數(shù)1-6都穩(wěn)定。在此情況下收集的數(shù)據(jù)可能超出設(shè)定的起始值和終止值的范圍。

數(shù)據(jù)間隔問題:
1. 源1的讀數(shù)穩(wěn)定在前一讀數(shù)加數(shù)據(jù)間隔上;
2. 要采集的信號讀數(shù)必須大于或等于設(shè)定的讀數(shù)閾值;
3. 設(shè)定的讀數(shù)1-6都穩(wěn)定;
4. 信號源1的讀數(shù)穩(wěn)定在誤差范圍內(nèi)或超出誤差范圍的時(shí)間超過1s。

讀數(shù)閾值設(shè)定:此數(shù)值的設(shè)定主要是用來排除誤差干擾信號。對于低于設(shè)定值的信號不做處理。

終止條件設(shè)定:
終止值及誤差范圍:當(dāng)源1的測量讀數(shù)在此范圍時(shí),會自動停止掃描。

從以上信息中得知,對于用作掃描信號的信號波形,并不是連續(xù)光滑的掃頻曲線,而是基本上以1秒為單位的步長階梯,并且這些頻點(diǎn)是以對數(shù)頻率步進(jìn)。如果要掃描的范圍是22Hz-22000Hz,則起始范圍比1000,常用對數(shù)值為3。如果劃分為30個(gè)頻點(diǎn),每個(gè)頻點(diǎn)步長為常用對數(shù)0.1。如果劃分為120個(gè)頻點(diǎn),則步長為0.025。如果更進(jìn)一步,劃分到150個(gè)頻點(diǎn),則步長為0.02。每個(gè)頻點(diǎn)的最短時(shí)間為1s。假設(shè)其為1.1s,則需要掃描165s,外加10s的1kHz標(biāo)準(zhǔn)信號,則整個(gè)掃描過程最少需要175s才能完成。

在matlab上,可以用以下代碼實(shí)現(xiàn)。
%以下程序中生成正弦波并播放。
Fs = 192000; % 采樣頻率
%寫10s 1kHz數(shù)據(jù)
T = 10; % 時(shí)間長度
n = Fs*T; % 采樣點(diǎn)數(shù)
f = 1000; % 聲音頻率
nBitSize = 24; %量化精度(位深度)  
y = sin(2*pi*f*T*linspace(0,1,n+1));
%sound(y,Fs);  %播放音頻數(shù)據(jù)
nStartFreq =20;  %起始頻率
nEndFreq=22000;  %終止頻率
nSteps=160;      %共掃描160個(gè)數(shù)據(jù)點(diǎn)
nLastT=1.1;      %每個(gè)頻點(diǎn)延時(shí)1.1秒
nCount = Fs*nLastT;
nStepLog = log10(nEndFreq/nStartFreq)/nSteps; %頻率增加的對數(shù)步距
for (nFreqLog =0:nSteps-1)
    fFreq = nStartFreq*10^(nFreqLog*nStepLog)            %實(shí)際掃描頻點(diǎn)
    y1=sin(2*pi*fFreq*nLastT*linspace(0,1,nCount+1)); %生成對應(yīng)頻率的正弦波數(shù)據(jù),頻率為計(jì)算的頻點(diǎn),時(shí)間1.1s
    y=[y,y1];                   %生成的數(shù)據(jù)與前面的波形數(shù)據(jù)合并
end
filename = 'd:\testfiles\Sweep_192K_24bit.wav';
audiowrite(filename, y, Fs, 'BitsPerSample',nBitSize,'Comment','Sweep_192K_24bit'); %保存聲音文件。
info = audioinfo(filename);
info                %顯示音頻文件的主要信息
msgbox('程序運(yùn)行結(jié)束。');

程序運(yùn)行后的顯示結(jié)果如下(matlab 8.01 64位版本,運(yùn)行時(shí)間7s):
info =
    Filename: 'D:\TestFiles\Sweep_192K_24bit.wav'
    CompressionMethod: 'Uncompressed' <-----默認(rèn)的文件格式,未壓縮的PCM格式。
          NumChannels: 1                            <------未指定聲道數(shù),默認(rèn)為單聲道。
           SampleRate: 192000
         TotalSamples: 35712161
             Duration: 186.0008                    <-------音樂文件總時(shí)長,186s
                Title: []
              Comment: 'Sweep_192K_24bit'  <---- 附加的信息。
               Artist: []
        BitsPerSample: 24

使用matlab的最大好處在于讀取和保存聲音文件非常方便。目前使用audioread, audiowrite 和 audioinfo函數(shù)替代了早期的wavread和wavwrite等函數(shù),把支持的音頻文件的格式擴(kuò)展到 WAV, OGG, FLAC,M4A,ALC等格式,全面支持24bit,32位,64位量化,以及各種采樣率的歸一化數(shù)據(jù),為音頻文件的處理提供了極大的靈活性。

使用 Audition 對該文件的頻譜做分析如下:

整體頻譜范圍在20-22kHz,前面一段10s 1KHz。

局部放大后,可以看到每個(gè)頻段的持續(xù)時(shí)間1S。在兩個(gè)不同頻點(diǎn)的連接處,可以看出頻譜很廣。


對波形數(shù)據(jù)做局部放大,可以看出,因?yàn)椴ㄐ螖?shù)據(jù)不連續(xù),導(dǎo)致其頻譜非常負(fù)載。

通過 matlab的強(qiáng)大運(yùn)算能力,可以對音頻數(shù)據(jù)的質(zhì)量做分析。以下的程序段用于將音頻數(shù)據(jù)文件讀到系統(tǒng)中,然后進(jìn)行FFT,獲取信號的頻譜。

%用fft方法分析 Wave波形文件的頻譜
%y 為音頻數(shù)據(jù)的存儲數(shù)組,F(xiàn)s為音頻數(shù)據(jù)的采樣率
%Pyy 用于保存音頻的歸一化幅度,Pyy_DB是轉(zhuǎn)換為dBV以后的數(shù)值。
%info用來獲取音頻文件的詳細(xì)信息,nBitSize是音頻文件的采樣率。
%nNormal 用于做歸一化使用的常數(shù),等于2^nBitSize。
%sigLength是音頻文件的總采樣個(gè)數(shù),halfLength是總采樣數(shù)的一半值。
%f是用于顯示頻率時(shí)的具體頻點(diǎn)值。

%##########################################################
clear;          %清理當(dāng)前內(nèi)存變量
clc;            %清理命令窗口
filename='D:\testfiles\1kHz_Sine_192kHz_24bit_2ch.wav';
[y,Fs]=audioread(filename); %讀數(shù)據(jù)文件
info = audioinfo(filename); %獲取音樂文件信息
nBitSize = info.BitsPerSample;%獲取文件中采樣深度
nNormal = 2^nBitSize;       %做幅度歸一化時(shí)的最大值
y=y(:,1);                   %僅使用雙聲道數(shù)據(jù)中的第一列(左聲道數(shù)據(jù))
sigLength = length(y);      %獲取數(shù)組長度
%Y1 = y.*hanning(sigLength); %使用Hanning窗變換?操作失敗,暫時(shí)去掉。
%完成FFT及獲取幅度值,以及幅度值的對數(shù)表示法(dBV)
Y=fft(y,sigLength);         %做標(biāo)準(zhǔn)FFT變換
Pyy = abs(Y)*2/sigLength/nNormal;  %求取變換結(jié)果的幅值部分,并做歸一化處理
Pyy_DB = 10*log10(Pyy);             %取常用對數(shù),變成dBV單位。
%以下處理畫圖部分
halflength = floor(sigLength/2);    %僅使用半長度做顯示
f=Fs*(0:halflength)/sigLength;      %生成索要用的頻點(diǎn)
semilogx(f,Pyy_DB(1:halflength+1));      %畫x軸對數(shù)曲線
title('1K-192kHz-24bit-2CH正弦波頻譜'); %標(biāo)題
xlabel('頻率(Hz)');                  %x軸標(biāo)記
ylabel('dBV');
grid on;                        %打開網(wǎng)格
msgbox('Done');                 %提示結(jié)束

實(shí)際運(yùn)行的結(jié)果如下:
直接用Audition 生成的192KHz,24bit采樣的正弦波,其頻譜如下:


對比 44.1kHz采樣率,16bit的1KHz Sine的MP3 頻譜如下,可以看出增加了很多高次諧波分量。


直接用Audition 生成的44.1kHz 16bit, 1KHz Sine 的頻譜,相對來說高頻分量較MP3好很多。


目前這個(gè)算法還有一點(diǎn)問題,就是計(jì)算出來的幅度值嚴(yán)重偏離正常的設(shè)定值,還需要做進(jìn)一步的修訂。


回復(fù)

使用道具 舉報(bào)

ID:112519 發(fā)表于 2016-4-7 09:24 | 顯示全部樓層
51黑有你更精彩!
回復(fù)

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表