使用Matlab实现录音与播放功能

 更新时间:2024年12月24日 10:12:03   作者:rbigbearr  
这篇文章主要为大家详细介绍了如何使用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.

到此这篇关于使用Matlab实现录音与播放功能的文章就介绍到这了,更多相关Matlab录音与播放内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 关于c语言中输出字符指针的相关问题

    关于c语言中输出字符指针的相关问题

    这篇文章主要介绍了关于c语言中输出字符指针的相关问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-07-07
  • C语言实现电影院选座管理系统

    C语言实现电影院选座管理系统

    这篇文章主要为大家详细介绍了C语言实现电影院选座管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-12-12
  • 分享C++三种类型new类型的运算符使用详情

    分享C++三种类型new类型的运算符使用详情

    这篇文章主要介绍了C++三种类型new运算符的使用详情,文章基于C++运算展开主题内容,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-04-04
  • 深入串的模式匹配算法(普通算法和KMP算法)的详解

    深入串的模式匹配算法(普通算法和KMP算法)的详解

    本篇文章是对串的模式匹配算法(普通算法和KMP算法)的应用进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • C语言内存管理及初始化细节示例详解

    C语言内存管理及初始化细节示例详解

    这篇文章主要为大家介绍了C语言内存管理及初始化细节示例的详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步
    2022-02-02
  • 判断机器大小端的两种实现方法

    判断机器大小端的两种实现方法

    第一种方法,思路:利用指针的强制类型转换。第二种方法,思路:利用共用体所有数据都从同一地址开始存储。
    2013-03-03
  • C/C++函数参数声明解析int fun() 与 int fun(void) 的区别讲解

    C/C++函数参数声明解析int fun() 与 int fun(void) 的区别讲解

    C++中int fun()和int fun(void)的区别在于函数参数的声明方式,前者默认允许任意参数,而后者表示没有参数,通过清晰的实例源代码,详细解释了它们在函数声明和调用中的不同之处,这篇文章介绍了C/C++函数参数声明int fun()与int fun(void)的差异,需要的朋友可以参考下
    2024-01-01
  • 如何在Qt中实现关于Json 的操作

    如何在Qt中实现关于Json 的操作

    JSON是一种轻量级数据交换格式,常用于客户端和服务端的数据交互,不依赖于编程语言,在很多编程语言中都可以使用JSON,这篇文章主要介绍了在Qt中实现关于Json的操作,需要的朋友可以参考下
    2023-08-08
  • OpenGL绘制三次Bezier曲线

    OpenGL绘制三次Bezier曲线

    这篇文章主要为大家详细介绍了OpenGL绘制三次Bezier曲线,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-04-04
  • 基于C++的数据库连接池的实现示例

    基于C++的数据库连接池的实现示例

    本文主要介绍了基于C++的数据库连接池,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-11-11

最新评论