使用Matlab實現(xiàn)錄音與播放功能
目的:使用matlab生成特定信號,Speaker循環(huán)播放這組信號的同時,Microphone啟動錄音。
一、生成一個單頻正弦信號
clc;clear;close all; Fs = 48000; % 采樣率為4800Hz f = 18000; % 正弦波頻率為18000Hz t = 0:1/Fs:10; % 從0到10秒的時間向量 y = sin(2*pi*f*t); % 生成正弦波信號 signal=[y',y']; %signal為n行2列,兩列數(shù)據(jù)含義表示左右聲道。 %[signal,fs]=audioread('recorded.wav'); %假如播放wav格式的文件,使用這個函數(shù)讀取。 signal=signal./max(abs(signal)); %歸一化數(shù)據(jù)
二、播放信號
1、方式1播放
未能實現(xiàn)循環(huán)播放
%方式1播放 sound(signal, Fs); % 播放正弦波信號 display("播放中。。。"); system("pause"); %阻塞線程 clear sound; %停止播放 return; %結(jié)束程序
2、方式2播放
實現(xiàn)循環(huán)播放
%方式2播放 % 創(chuàng)建audioplayer對象 player = audioplayer(allaudio, Fs); % 設(shè)置播放結(jié)束時的回調(diào)函數(shù) set(player, 'TimerFcn', {@audioplayerCallback, player}); % 播放音頻 play(player); display("播放中。。。"); system("pause"); stop(player); return;
回調(diào)函數(shù)需要放在程序的最下邊,回調(diào)函數(shù)實現(xiàn)如下:
function audioplayerCallback(obj, event,player) if player.CurrentSample == player.TotalSamples % 當(dāng)播放結(jié)束時,重新播放音頻 stop(player); play(player); end end
有關(guān)sound和audioplayer更多應(yīng)用可以查看幫助文檔
doc sound doc audioplayer
三、錄制音頻
使用audiorecorder函數(shù)進行錄制,首先設(shè)置錄音格式,選定錄音設(shè)備,錄音設(shè)備ID可以通過指令info=audiodevinfo查看。錄制時可以設(shè)置錄音時間,也可以手動開始與關(guān)閉。代碼中實現(xiàn)的是手動開始與關(guān)閉。
Fs=48000; %采樣率 nBits=16; %位深 nChannels=2; %通道數(shù) %info=audiodevinfo; %獲取電腦上所有的輸入和輸入的音頻設(shè)備,通過名稱確定您要使用的聲卡,并記錄其ID值 ID=-1; %默認輸入設(shè)備 recObj = audiorecorder(Fs,nBits,nChannels,ID); disp("開始錄音.") %recDuration = 20; %定時錄音 %recordblocking(recObj,recDuration); %定時錄音方式 record(recObj) %手動錄音 disp("press any key...") pause %阻塞線程 stop(recObj)%停止錄音 disp("結(jié)束錄音.") %獲取錄音數(shù)據(jù) Recording=getaudiodata(recObj); %play(recObj); %播放錄音 Lrecord=Recording(:,1); %左聲道數(shù)據(jù) Rrecord=Recording(:,2); %右聲道數(shù)據(jù) %plot(abs(fft(Lrecord,Fs))); %對錄音數(shù)據(jù)進行fft變換 return;
三、同時播放與錄制完整代碼
clc;clear;close all; Fs = 48000; % 采樣率為4800Hz f = 18000; % 正弦波頻率為18000Hz t = 0:1/Fs:10; % 從0到10秒的時間向量 y = sin(2*pi*f*t); % 生成正弦波信號 signal=[y',y']; %signal為n行2列,兩列數(shù)據(jù)含義表示左右聲道。 %[signal,fs]=audioread('recorded.wav'); %假如播放wav格式的文件,使用這個函數(shù)讀取。 signal=signal./max(abs(signal)); %歸一化數(shù)據(jù) %方式1播放 % sound(signal, Fs); % 播放正弦波信號 % display("播放中。。。"); % system("pause"); %阻塞線程 %方式2 player = audioplayer(signal, Fs); % 設(shè)置播放結(jié)束時的回調(diào)函數(shù) set(player, 'TimerFcn', {@audioplayerCallback, player}); % 播放音頻 play(player); Fs=48000; %采樣率 nBits=16; %位深 nChannels=2; %通道數(shù) %info=audiodevinfo; %獲取電腦上所有的輸入和輸入的音頻設(shè)備,通過名稱確定您要使用的聲卡,并記錄其ID值 ID=-1; %默認輸入設(shè)備 recObj = audiorecorder(Fs,nBits,nChannels,ID); disp("開始錄音.") %recDuration = 20; %定時錄音 %recordblocking(recObj,recDuration); %定時錄音方式 record(recObj) %手動錄音 disp("press any key...") pause %阻塞線程 stop(recObj)%停止錄音 stop(player); %停止播放 disp("結(jié)束錄音.") %獲取錄音數(shù)據(jù) Recording=getaudiodata(recObj); %play(recObj); %播放錄音 Lrecord=Recording(:,1); Rrecord=Recording(:,2); plot(abs(fft(Lrecord,Fs))); %對錄音數(shù)據(jù)進行fft變換 return; function audioplayerCallback(obj, event,player) if player.CurrentSample == player.TotalSamples % 當(dāng)播放結(jié)束時,重新播放音頻 stop(player); play(player); end end
結(jié)果
生成的正弦波信號是18k,故將錄制到的音頻數(shù)據(jù)進行fft變換,得到18k.
到此這篇關(guān)于使用Matlab實現(xiàn)錄音與播放功能的文章就介紹到這了,更多相關(guān)Matlab錄音與播放內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
關(guān)于C語言多線程pthread庫的相關(guān)函數(shù)說明
下面小編就為大家?guī)硪黄P(guān)于C語言多線程pthread庫的相關(guān)函數(shù)說明。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-05-05