使用Matlab實(shí)現(xiàn)錄音與播放功能
目的:使用matlab生成特定信號(hào),Speaker循環(huán)播放這組信號(hào)的同時(shí),Microphone啟動(dòng)錄音。
一、生成一個(gè)單頻正弦信號(hào)
clc;clear;close all;
Fs = 48000; % 采樣率為4800Hz
f = 18000; % 正弦波頻率為18000Hz
t = 0:1/Fs:10; % 從0到10秒的時(shí)間向量
y = sin(2*pi*f*t); % 生成正弦波信號(hào)
signal=[y',y']; %signal為n行2列,兩列數(shù)據(jù)含義表示左右聲道。
%[signal,fs]=audioread('recorded.wav'); %假如播放wav格式的文件,使用這個(gè)函數(shù)讀取。
signal=signal./max(abs(signal)); %歸一化數(shù)據(jù)
二、播放信號(hào)
1、方式1播放
未能實(shí)現(xiàn)循環(huán)播放
%方式1播放
sound(signal, Fs); % 播放正弦波信號(hào)
display("播放中。。。");
system("pause"); %阻塞線程
clear sound; %停止播放
return; %結(jié)束程序
2、方式2播放
實(shí)現(xiàn)循環(huán)播放
%方式2播放
% 創(chuàng)建audioplayer對象
player = audioplayer(allaudio, Fs);
% 設(shè)置播放結(jié)束時(shí)的回調(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é)束時(shí),重新播放音頻
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í)可以設(shè)置錄音時(shí)間,也可以手動(dòng)開始與關(guān)閉。代碼中實(shí)現(xiàn)的是手動(dòng)開始與關(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; %定時(shí)錄音
%recordblocking(recObj,recDuration); %定時(shí)錄音方式
record(recObj) %手動(dòng)錄音
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;三、同時(shí)播放與錄制完整代碼
clc;clear;close all;
Fs = 48000; % 采樣率為4800Hz
f = 18000; % 正弦波頻率為18000Hz
t = 0:1/Fs:10; % 從0到10秒的時(shí)間向量
y = sin(2*pi*f*t); % 生成正弦波信號(hào)
signal=[y',y']; %signal為n行2列,兩列數(shù)據(jù)含義表示左右聲道。
%[signal,fs]=audioread('recorded.wav'); %假如播放wav格式的文件,使用這個(gè)函數(shù)讀取。
signal=signal./max(abs(signal)); %歸一化數(shù)據(jù)
%方式1播放
% sound(signal, Fs); % 播放正弦波信號(hào)
% display("播放中。。。");
% system("pause"); %阻塞線程
%方式2
player = audioplayer(signal, Fs);
% 設(shè)置播放結(jié)束時(shí)的回調(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; %定時(shí)錄音
%recordblocking(recObj,recDuration); %定時(shí)錄音方式
record(recObj) %手動(dòng)錄音
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é)束時(shí),重新播放音頻
stop(player);
play(player);
end
end結(jié)果
生成的正弦波信號(hào)是18k,故將錄制到的音頻數(shù)據(jù)進(jìn)行fft變換,得到18k.

到此這篇關(guān)于使用Matlab實(shí)現(xiàn)錄音與播放功能的文章就介紹到這了,更多相關(guān)Matlab錄音與播放內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C語言實(shí)現(xiàn)電影院選座管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)電影院選座管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-12-12
C語言內(nèi)存管理及初始化細(xì)節(jié)示例詳解
這篇文章主要為大家介紹了C語言內(nèi)存管理及初始化細(xì)節(jié)示例的詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2022-02-02
C/C++函數(shù)參數(shù)聲明解析int?fun()?與?int?fun(void)?的區(qū)別講解
C++中int fun()和int fun(void)的區(qū)別在于函數(shù)參數(shù)的聲明方式,前者默認(rèn)允許任意參數(shù),而后者表示沒有參數(shù),通過清晰的實(shí)例源代碼,詳細(xì)解釋了它們在函數(shù)聲明和調(diào)用中的不同之處,這篇文章介紹了C/C++函數(shù)參數(shù)聲明int?fun()與int?fun(void)的差異,需要的朋友可以參考下2024-01-01
如何在Qt中實(shí)現(xiàn)關(guān)于Json?的操作
JSON是一種輕量級(jí)數(shù)據(jù)交換格式,常用于客戶端和服務(wù)端的數(shù)據(jù)交互,不依賴于編程語言,在很多編程語言中都可以使用JSON,這篇文章主要介紹了在Qt中實(shí)現(xiàn)關(guān)于Json的操作,需要的朋友可以參考下2023-08-08
基于C++的數(shù)據(jù)庫連接池的實(shí)現(xiàn)示例
本文主要介紹了基于C++的數(shù)據(jù)庫連接池,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2025-11-11

