matlab与音频处理
MATLAB?與 音頻處理 相關內容摘記
MATLAB?與 音頻處理 相關內容摘記?1
MATLAB?音頻相關函數?1
MATLAB?處理音頻信號的流程?2
音量標準化?2
聲道分離合并與組合?3
數字濾波?3
數據轉換?5
基于MATLAB?的數字濾波實驗?6
MATLAB?音頻相關函數
聲音數據輸入輸出函數:
可以方便地讀寫au和way文件,并可控制其中的位及頻率。
wavread()和wavwriteO。
聲音播放:
wavplay():播放wav聲音文件。當然,也可以把處理后的
wav文件保存后再用其它工具播放。
wavrecordO:可以對處理后的wav文件進行錄音。
PS:在日常生活中,我們聽到的聲音一般都屬于復音,其聲音信號由不同的振幅與頻率的波合成而得到
MATLAB?處理音頻信號的流程
分析和處理音頻信號 首先要對聲音信號進行采集?MATLAB?的數據采集工具箱提供了一整套命令和函數,通過調用這些函數和命令,可直接控制聲卡進行數據采集[1] Windows?自帶的錄音機程序也可驅動聲卡來采集語音信號 并能保存為?WAV?格式文件供?MATLAB?相關函數直接讀取 寫入或播放 本文以?WAV?格式音頻信號作為分析處理的輸入數據 用?MATLAB?處理音頻信號的基本流程是 先將?WAV?格式音頻信號經?wavread?函數轉換成?MATLAB?列數組變量 再用?MATLAB?強大的運算能力進行數據分析和處理 如時域分析 頻域分析 數字濾波 信號合成 信號變換 識別和增強等等 處理后的數據如是音頻數據 則可用?wavwrite?轉換成?WAV?格式文件或用?sound wavplay?等函數直接回放 下面分別介紹?MATLAB?在音量標準化 聲道分離合并與組合 數字濾波 數
據轉換等音頻信號處理方面的技術實現
?音量標準化
錄制聲音過程中需對聲音電平進行量化處理 最理想的量化是最大電平對應最高量化比特 但實際卻很難做到 常有音輕問題 利用?MATLAB?很容易實現音量標準化 即最大電平對應最高量化比特 基本步驟是 先用?wavread?函數將?WAV?文件轉換成列數組變量 再求出數組變量的極值并對所有元素作歸一化處理 最后用?wavwrite?函數還原成音量標準化的?WAV?文件
例?1?現以微軟自帶的?Windows XP?關機.wav?音頻信號為例 先將其復制另存到文件名為XPexit.wav?的?MATLAB?當前目錄中
再通過音量標準化處理后保存為?XPquit.wav?文件 實現程序如下
clear; close all; clc;
[Y,FS,NBITS]=wavread('XPexit.WAV'); %?將?WAV?文件轉換成變量
FS,NBITS, %?顯示采樣頻率和量化比特
Ym=max(max(max(Y)),max(abs(min(Y)))), %?找出雙聲道極值
X=Y/Ym; %?歸一化處理
wavwrite(X,FS,NBITS,'XPquit.wav') %?將變量轉換成?WAV?文件
試聽可知標準化處理后音量稍大
聲道分離合并與組合
立體聲或雙聲道音頻信號有左右兩個聲道 利用?MATLAB?實現雙聲道分離 兩路聲道合并和兩個單聲道組合成一個雙聲道等效果 實際上是利用了?MATLAB?的矩陣抽取 矩陣相加和矩陣重組運算
例?2?現以例?1?生成的?XPquit.wav?為例 實現分離 合并和組合處理的程序如下
clear; close all; clc;
[x,FS,NBITS]=wavread('XPquit.WAV'); %?將?WAV?文件轉換成變量
x1=x(:,1); %?抽取第?1?聲道
x2=x(:,2); %?抽取第?2?聲道
wavwrite(x1,FS,NBITS,'XPquit1.WAV'); %?實現?1?聲道分離
wavwrite(x2,FS,NBITS,'XPquit2.WAV'); %?實現?2?聲道分離
%如果合并位置不對前面補?0 %聲道長度不對后面補?0
x12=x1+x2; %?兩路單聲道列向量矩陣變量合并
x12m=max(max(x12),abs(min(x12))), %?找出極值
y12=x12./x12m; %?歸一化處理
wavwrite(y12,FS,NBITS,'XPquit12.WAV'); %?實現兩路聲道合并
%如果組合位置不對前面補?0--聲道長度不對后面補?0
x3=[x1,x2]; %?兩路單聲道變量組合
wavwrite(x3,FS,NBITS,'XPquit3.WAV'); %?實現兩路聲道組合
可以試聽聲道分離 合并與組合的效果 也可對各文件大小進行比較
數字濾波
數字濾波是常用的音頻處理技術 可根據技術指標 先利用?FDATool?工具 設計一個數字濾波器[2]再用?Filter?或?Filter2?函數即可實現濾波處理 調用的?Filter?函數格式是?Y = filte (B,A,X)?其中?B和?A?是濾波器傳輸函數的分子和分母系數?X?是輸入變量?Y是實現濾波后的輸出變量 如果處理立體聲音頻信號 可分開處理 但用?FIR?濾波器時調用?Filter2?函數更方便
例?3?現以例?2?生成的?XPquit12.wav?為例 實現數字濾波的程序如下
clear; close all; clc;
[X,FS,NBITS]=wavread('XPquit12.WAV'); %?將?WAV?文件轉換成變量
%利用?FDATool?設計一個?LowpassButterworth?濾波器
%指標?FS=22050Hz Fp=1000Hz Ap=1dB Fs=3000Hz As=20dB
B =[0.0062,0.0187,0.0187,0.0062]; %?分子系數
A =[1,-2.1706,1.6517,-0.4312]; %?分母系數
Y=filter(B,A,X); %?實現數字濾波
t=(0:length(X)-1)/FS; %?計算數據時刻
subplot(2,2,1);plot(t,X); %?繪制原波形圖
title('?原信號波形圖?'); %?加標題
subplot(2,2,3);plot(t,Y); %?繪制濾波波形圖
title('?濾波后波形圖?'); %?加標題
xf=fft(X); %?作傅里葉變換求原頻譜
yf=fft(Y); %?作傅里葉變換求濾波后頻譜
fm=3000*length(xf)/FS; %?確定繪頻譜圖的上限頻率
f=(0:fm)*FS/length(xf); %?確定繪頻譜圖的頻率刻度
subplot(2,2,2);plot(f,abs(xf(1:length(f)))); %?繪制原波形頻譜圖
title('?原信號頻譜圖?'); %?加標題
subplot(2,2,4);plot(f,abs(yf(1:length(f)))); %?繪制濾波后頻譜圖
title('?濾波后信號頻譜圖?'); %?加標題
wavwrite(Y,FS,NBITS,'XPquitFilter.WAV'); %?寫成?WAV?文件
程序運行結果如圖?1?所示 由圖可知 濾波對波形影響不大
但對高頻有較大衰減 試聽會感覺到處理后的聲音比較沉悶
數據轉換
數據轉換是指改變音頻格式中的采樣頻率或量化位數 轉換原理是 先用矩陣插值或抽取技術實現變量變換 如果是抽取數據還需在變換前作濾波處理使之滿足采樣定理 變量變換完成后再用Wavwrite?函數重新定義量化位數和采樣頻率即可實現數據轉換 數據轉換過程中 要注意采樣頻率與原始采樣頻率及插值或抽取系數的關系?MATLAB?實現插值或抽取的函數有?decimate ,interp?和resample
這里以?2?倍抽取為例 將例?3?中經過濾波后產生的?XPquitFilter.WAV?文件進行數據轉換處理 具體程序如下
clear; close all; clc;
[x,FS,NBITS]=wavread('XPquitFilter.WAV'); %?將?WAV?文件轉換成變量
N=length(x); %?計算數據點數
%?不是偶數點化成偶數點
if mod(N,2)==0; N=N; else x(N)=[]; N=N-1; end;
%?原信號波形頻譜分析
tx=(0:N-1)/FS; %?計算原信號數據點時刻
subplot(3,2,1);plot(tx,x); %?繪制原信號波形
title('?原信號波形圖?'); %?加標題
xf=fft(x); %?求原信號頻譜
fx=(0:N/2)*FS/N; %?確定頻譜圖頻率刻度
subplot(3,2,2);plot(fx,abs(xf(1:N/2+1))); %?繪制原信號頻譜
title('?原信號頻譜圖?'); %?加標題
%?實現數據抽取
k=[1:N/2]; %?確定抽取位置
y=x(2*k); %?實現抽取后的數據
M=length(y); %?計算抽取后數據點數
%?抽取數據在原采樣頻率?FS?下的波形頻譜分析
ty=(0:M-1)/FS; %?計算數據點時刻
subplot(3,2,3);plot(ty,y); %?繪制信號波形圖
title('?原采樣率下新波形圖?'); %?加標題
yf=fft(y); %?求頻譜
fy=(0:M/2)*FS/M; %?確定頻譜圖頻率刻度
subplot(3,2,4);plot(fy,abs(yf(1:M/2+1))); %?繪制頻譜圖
title('?原采樣率下新頻譜圖?'); %?加標題
%?抽取數據在?FS/2?采樣頻率下的波形頻譜分析
tz=(0:M-1)/(FS/2); %?計算數據點時刻
subplot(3,2,5);plot(tz,y); %?繪制信號波形圖
title('?新采樣率下新波形圖?'); %?加標題
fz=(0:M/2)*(FS/2)/M; %?確定頻譜圖頻率刻度
subplot(3,2,6);plot(fz,abs(yf(1:M/2+1))); %?繪制頻譜圖
title('?新采樣率下新頻譜圖?'); %?加標題
%?實現數據轉換
wavwrite (y,FS/2,NBITS,'XPquit16B.WAV'); %?音頻格式?PCM
11025Hz 16?位
wavwrite (y,FS/2,NBITS/2,'XPquit8B.WAV'); %?音頻格式?PCM
11025Hz 8?位
運行程序 在得到的圖形窗口中 執行?Edit/Axes Properties命令 再把各分圖下?X?標簽中的?Limits設為?0,0.01?和?0, 1000?得到?0--0.01?秒的波形和?0 --1000Hz?的頻譜如圖?2?所示 由圖可知在滿足采樣定律條件下 實現數據抽取 在原采樣率下波形變密頻譜變寬且幅度減半 但在新采樣率下波形和頻譜都很好 通過試聽輸出文件還可感受處理效果
基于MATLAB?的數字濾波實驗
總結
以上是生活随笔為你收集整理的matlab与音频处理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 功率谱密度相关方法MATLAB实现
- 下一篇: 点除与矩阵除法