目的:使用matlab生成特定信号,Speaker循环播放这组信号的同时,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列,两列数据含义表示左右声道。
%[signal,fs]=audioread('recorded.wav'); %假如播放wav格式的文件,使用这个函数读取。
signal=signal./max(abs(signal)); %归一化数据
二、播放信号
1、方式1播放
未能实现循环播放
%方式1播放
sound(signal, Fs); % 播放正弦波信号
display("播放中。。。");
system("pause"); %阻塞线程
clear sound; %停止播放
return; %结束程序
2、方式2播放
实现循环播放
%方式2播放
% 创建audioplayer对象
player = audioplayer(allaudio, Fs);
% 设置播放结束时的回调函数
set(player, 'TimerFcn', {@audioplayerCallback, player});
% 播放音频
play(player);
display("播放中。。。");
system("pause");
stop(player);
return;
回调函数需要放在程序的最下边,回调函数实现如下:
function audioplayerCallback(obj, event,player)
if player.CurrentSample == player.TotalSamples
% 当播放结束时,重新播放音频
stop(player);
play(player);
end
end
有关sound和audioplayer更多应用可以查看帮助文档
doc sound
doc audioplayer
三、录制音频
使用audiorecorder函数进行录制,首先设置录音格式,选定录音设备,录音设备ID可以通过指令info=audiodevinfo查看。录制时可以设置录音时间,也可以手动开始与关闭。代码中实现的是手动开始与关闭。
Fs=48000; %采样率
nBits=16; %位深
nChannels=2; %通道数
%info=audiodevinfo; %获取电脑上所有的输入和输入的音频设备,通过名称确定您要使用的声卡,并记录其ID值
ID=-1; %默认输入设备
recObj = audiorecorder(Fs,nBits,nChannels,ID);
disp("开始录音.")
%recDuration = 20; %定时录音
%recordblocking(recObj,recDuration); %定时录音方式
record(recObj) %手动录音
disp("press any key...")
pause %阻塞线程
stop(recObj)%停止录音
disp("结束录音.")
%获取录音数据
Recording=getaudiodata(recObj);
%play(recObj); %播放录音
Lrecord=Recording(:,1); %左声道数据
Rrecord=Recording(:,2); %右声道数据
%plot(abs(fft(Lrecord,Fs))); %对录音数据进行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列,两列数据含义表示左右声道。
%[signal,fs]=audioread('recorded.wav'); %假如播放wav格式的文件,使用这个函数读取。
signal=signal./max(abs(signal)); %归一化数据
%方式1播放
% sound(signal, Fs); % 播放正弦波信号
% display("播放中。。。");
% system("pause"); %阻塞线程
%方式2
player = audioplayer(signal, Fs);
% 设置播放结束时的回调函数
set(player, 'TimerFcn', {@audioplayerCallback, player});
% 播放音频
play(player);
Fs=48000; %采样率
nBits=16; %位深
nChannels=2; %通道数
%info=audiodevinfo; %获取电脑上所有的输入和输入的音频设备,通过名称确定您要使用的声卡,并记录其ID值
ID=-1; %默认输入设备
recObj = audiorecorder(Fs,nBits,nChannels,ID);
disp("开始录音.")
%recDuration = 20; %定时录音
%recordblocking(recObj,recDuration); %定时录音方式
record(recObj) %手动录音
disp("press any key...")
pause %阻塞线程
stop(recObj)%停止录音
stop(player); %停止播放
disp("结束录音.")
%获取录音数据
Recording=getaudiodata(recObj);
%play(recObj); %播放录音
Lrecord=Recording(:,1);
Rrecord=Recording(:,2);
plot(abs(fft(Lrecord,Fs))); %对录音数据进行fft变换
return;
function audioplayerCallback(obj, event,player)
if player.CurrentSample == player.TotalSamples
% 当播放结束时,重新播放音频
stop(player);
play(player);
end
end
结果
生成的正弦波信号是18k,故将录制到的音频数据进行fft变换,得到18k.
标签:Fs,signal,录音,recObj,player,Matlab,播放 From: https://blog.csdn.net/rbigbearr/article/details/136709275