欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標題: 用matlab處理音頻文件 [打印本頁]

作者: 51hei人人    時間: 2016-3-12 21:01
標題: 用matlab處理音頻文件
用Audio Precision 2722來檢測音頻系統的頻響曲線,其中有一種方法是利用被檢測設備中聲音文件發出的頻率作為掃頻信號源,檢測系統的實際頻響效果。其中對這個掃頻信號是有較為嚴格的要求。具體要求(參考外部掃描規則設置External Sweep Rules)如下:

1. 在掃描的源1中,選擇模擬信號分析儀的讀數值A通道的頻率作為信號源。 起始頻率為20Hz,終止頻率為22kHz,中間頻率采用是對數方式增長。但是這些具體的頻率是多少呢,需要通過外部規則來設定。因此,需要打開"External Rules..."按鈕,做詳細設定。
  
在 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' <-----默認的文件格式,未壓縮的PCM格式。
          NumChannels: 1                            <------未指定聲道數,默認為單聲道。
           SampleRate: 192000
         TotalSamples: 35712161
             Duration: 186.0008                    <-------音樂文件總時長,186s
                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采樣的正弦波,其頻譜如下:


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


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


目前這個算法還有一點問題,就是計算出來的幅度值嚴重偏離正常的設定值,還需要做進一步的修訂。



作者: 4656清水芙蓉    時間: 2016-4-7 09:24
51黑有你更精彩!





歡迎光臨 (http://www.raoushi.com/bbs/) Powered by Discuz! X3.1