Matlab的录音与播放

目的:使用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.

  • 18
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值