使用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录音与播放内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 基于Matlab实现有雪花飘落的圣诞树的绘制

    基于Matlab实现有雪花飘落的圣诞树的绘制

    圣诞节快到了(虽然还有十天),一起来用MATLAB画个简单圣诞树叭~代码几乎取消了全部的循环,因此至少需要17b之后的版本,仅存的循环用来让树旋转起来,让雪花飘落起来,让树顶上的星光摇曳起来~感兴趣的可以试一试
    2022-12-12
  • 《C++ primer plus》读书笔记(二)

    《C++ primer plus》读书笔记(二)

    本读书笔记是读了《C++ primer plus(第六版)》第五至八章的学习笔记。是C++读书笔记系列的第二篇。复习C++基础知识的可以瞄瞄。
    2014-10-10
  • vc控制台程序关闭事件时的处理方式及注意点详解

    vc控制台程序关闭事件时的处理方式及注意点详解

    在本篇文章里小编给大家整理的是一篇关于vc控制台程序关闭事件时的正确处理方式的相关知识点内容,对此有需求的朋友们可以参阅下。
    2021-12-12
  • 使用root权限运行自己所编译程序的解决方法

    使用root权限运行自己所编译程序的解决方法

    本篇文章介绍了,使用root权限运行自己所编译程序的解决方法。需要的朋友参考下
    2013-05-05
  • C++设计模式中的桥模式你了解吗

    C++设计模式中的桥模式你了解吗

    这篇文章主要为大家详细介绍了C++设计模式中的桥模式,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-03-03
  • C++实现LeetCode(117.每个节点的右向指针之二)

    C++实现LeetCode(117.每个节点的右向指针之二)

    这篇文章主要介绍了C++实现LeetCode(117.每个节点的右向指针之二),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • C语言循环链表的原理与使用操作

    C语言循环链表的原理与使用操作

    无论是静态链表还是动态链表,有时在解决具体问题时,需要我们对其结构进行稍微地调整。比如,可以把链表的两头连接,使其成为了一个环状链表,通常称为循环链表
    2022-05-05
  • C语言数据类型枚举enum全面详解示例教程

    C语言数据类型枚举enum全面详解示例教程

    生活中有很多地方会用到枚举,比如一周有7天,可以一一枚举;性别有男、女...等等都可以可以一一枚举,今天来和笔者一起学习一下c语言枚举吧
    2021-10-10
  • C++基于prim实现迷宫生成

    C++基于prim实现迷宫生成

    这篇文章主要为大家详细介绍了C++基于prim实现迷宫生成,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-05-05
  • C++形参与实参的区别实例解析

    C++形参与实参的区别实例解析

    这篇文章主要介绍了C++形参与实参的区别实例解析,需要的朋友可以参考下
    2014-07-07

最新评论