开发者

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

开发者 https://www.devze.com 2025-04-09 14:32 出处:网络 作者: rbigbearr
目录一、生成一个单频正弦信号二、播放信号1、方式1播放2、方式2播放三、录制音频三、同时播放与录制完整代码结果目的:使用matlab生成特定信号,Speaker循环播放这组信号的同时,Microphone启动录音。
目录
  • 一、生成一个单频正弦信号
  • 二、播放信号
    • 1、方式1播放
    • 2、方式2播放
  • 三、录制音频
    • 三、同时播放与录制完整代码
      • 结果

        目的:使用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播www.devze.com

        未能实现循环播放

        %方式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("播放中。。。");
        systhttp://www.devze.comem("pause");
        stop(player);
        return;
        

        回调函数需要放在程序的最下边,回调函数实现如下:

        function audioplayerCallback(obj, event,player)
            if player.Curr编程entSample == 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(Lrandroidecord,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;
        VSYeKFto 
        function audioplayerCallback(obj, event,player)
            if player.CurrentSample == player.TotalSamples
                % 当播放结束时,重新播放音频
                stop(player);
                play(player);
            end
        end

        结果

        生成的正弦波信号是18k,故将录制到的音频数据进行fft变换,得到18k.

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

        到此这篇关于使用Matlab实现录音与播放功能的文章就介绍到这了,更多相关Matlab录音与播放内容请搜索编程客栈(www.devze.com)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程客栈(www.devze.com)!

        0

        精彩评论

        暂无评论...
        验证码 换一张
        取 消

        关注公众号