使用Matlab實(shí)現(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播放
未能實(shí)現(xiàn)循環(huán)播放
%方式1播放
sound(signal, Fs); % 播放正弦波信號
display("播放中。。。");
system("pause"); %阻塞線程
clear sound; %停止播放
return; %結(jié)束程序
2、方式2播放
實(shí)現(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ù)實(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ù)進(jìn)行錄制,首先設(shè)置錄音格式,選定錄音設(shè)備,錄音設(shè)備ID可以通過指令info=audiodevinfo查看。錄制時可以設(shè)置錄音時間,也可以手動開始與關(guān)閉。代碼中實(shí)現(xiàn)的是手動開始與關(guān)閉。
Fs=48000; %采樣率
nBits=16; %位深
nChannels=2; %通道數(shù)
%info=audiodevinfo; %獲取電腦上所有的輸入和輸入的音頻設(shè)備,通過名稱確定您要使用的聲卡,并記錄其ID值
ID=-1; %默認(rèn)輸入設(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ù)進(jìn)行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; %默認(rèn)輸入設(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ù)進(jìn)行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ù)進(jìn)行fft變換,得到18k.

到此這篇關(guān)于使用Matlab實(shí)現(xiàn)錄音與播放功能的文章就介紹到這了,更多相關(guān)Matlab錄音與播放內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
vscode編譯運(yùn)行c語言報(bào)錯亂碼的解決
本文主要介紹了vscode編譯運(yùn)行c語言報(bào)錯亂碼,文中通過圖文介紹的的非常詳細(xì),需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-07-07
關(guān)于C語言多線程pthread庫的相關(guān)函數(shù)說明
下面小編就為大家?guī)硪黄P(guān)于C語言多線程pthread庫的相關(guān)函數(shù)說明。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-05-05

