夹子音转换器matlab

news2024/11/22 11:32:03

操作过程点击此处观看
上段时间补习了一下傅里叶变化的知识,突发奇想可以根据此做一款声音转换器,使用工科神器Matlab进行完成,并且开发了可操作界面如下图所示:
夹子音转换器界面展示

功能实现与描述

软件中可以实现声音的录制、回放、文件的保存与打开功能,两个旋钮括约肌肛缩可以调整声音的频率与播放速度。

声音录制

matlab封装了声音的开始录制与结束录制功能函数,该软件使用appdesigner进行开发,声音录制与暂停按键的callback函数如下:

            global FlagStartOrEnd;              %控制开始或结束录制标志位
            global recObj;                      %录音对象
            global TextState;                   %状态信息提示
            global TagSoundData;                %目标音源数据
            global TagSoundFs;                  %目标音源频率
            global MinAbsValue;                 %最小绝对值 傅里叶变化数值
            
            if FlagStartOrEnd
                % 切换开始录音图片               %开始录音
                app.ButtonStartRecording.Icon = 'Start.png';
                % 重置标志位
                FlagStartOrEnd = false;
                
                % 结束录音
                stop(recObj);
                
                % 获取录音数据
                audioData = getaudiodata(recObj);
                
                % 参数传递
                TagSoundData = audioData;
                TagSoundFs = 22050;
                
                % 图像展示
                [ResFreq, ResMag, ResPhase] = FFTAnslysis(app, TagSoundData, TagSoundFs, MinAbsValue, '录制声音', 100);
                
                % 状态信息提示
                TextState = {'录音结束了哦(^_^)'};
                app.TextAreaState.Value = TextState;
                
                % 另存为录音文件
                [FileName, FilePath] = uiputfile('*.wav');
                
                % 状态信息提示
                TextState = {['文件<', FileName, '>保存完成了呐'], TextState{:}};
                app.TextAreaState.Value = TextState;
                
                %将音频文件写入到wav
                audiowrite(FileName, audioData, 22050);
                
                
            else
                % 切换结束录音图片              %结束录音
                app.ButtonStartRecording.Icon = 'End.png';
                % 重置标志位
                FlagStartOrEnd = true;
                
                % 打开录音设备
                record(recObj);
                
                % 状态信息提示
                TextState = {'小哥哥开始录音啦...', TextState{:}};
                app.TextAreaState.Value = TextState;
                
                
            end

需要说明的是,全局变量的定义需要在appdesigner中的startup函数中,代码如下:

            global FlagStartOrEnd;              %控制开始或结束录制标志位
            global recObj;                      %录音对象
            global TextState;                   %状态信息提示
            global TagSoundData;                %目标音源数据
            global TagSoundFs;                  %目标音源频率
            global MinAbsValue;                 %最小绝对值 傅里叶变化数值
            
            FlagStartOrEnd = false;
            recObj = audiorecorder(22050, 16, 1); %第一个参数为声音的采集频率
            TextState = {};
            TagSoundData = [];
            TagSoundFs = [];
            MinAbsValue = 1e-16;

声音回放

声音的回放直接调用sound函数,为实现夹子声音的转换,shiftPitch函数可以调整声音频率,函数中可以接收旋钮括约肌的数值,声音的播放速度可以通过调整sound函数第二个参数来实现。代码如下:

            global TagSoundData;                %目标音源数据
            global TagSoundFs;                  %目标音源频率
            global MinAbsValue;                 %最小绝对值 傅里叶变化数值
            
            % 夹子音转换
            TagSoundDataTemp = shiftPitch(TagSoundData, app.KnobShiftFs.Value, 1, TagSoundFs, 0);
            
            % 计算时间比率
            if app.KnobShiftTime.Value >= 0
                TimeRate = 0.4*app.KnobShiftTime.Value + 1;
            else
                TimeRate = 0.08*app.KnobShiftTime.Value + 1;
            end
            
            
            % 听取声音
            sound(TagSoundDataTemp, TagSoundFs*TimeRate);
            
            % 图像展示
            [ResFreq, ResMag, ResPhase] = FFTAnslysis(app, TagSoundData, TagSoundFs, MinAbsValue, '声音展示', 100);

文件保存

声音文件的保存可以直接使用audiowrite函数实现,代码如下:

            global TagSoundData;                %目标音源数据
            global TagSoundFs;                  %目标音源频率
            global TextState;                   %状态信息提示
            
            % 将音频文件写入到wav文件
            FileName = ['Sound.wav'];
            audiowrite(FileName, TagSoundData, TagSoundFs);
            
            % 加入提示信息
            TextState = {['音频文件<', FileName, '>已保存了哦'], TextState{:}};
            app.TextAreaState.Value = TextState;

文件打开

文件打开可以使用audioread实现

            global TagSoundData;                %目标音源数据
            global TagSoundFs;                  %目标音源频率
            global TextState;                   %状态信息提示
            
            % 获取音源文件
            [FileName, FilePath] = uigetfile('*wav', '小哥哥打开音频文件哦');
            
            % 加入提示信息
            TextState = {['音频文件<', FileName, '>已打开了哦'], TextState{:}};
            app.TextAreaState.Value = TextState;
            
            % 打开音源数据
            [TagSoundData, TagSoundFs] = audioread([FilePath, '\', FileName]);

图像展示

图像中可以展示声音的时域与频域曲线,对采集的声音做傅里叶变化可以将时域信息转换为频域信息,实现代码如下:

        function [ResFreq, ResMag, ResPhase] = FFTAnslysis(app, TagData, TagFs, MinAbsValue, Name, NumOrder)
            
            %% 参数含义
            %输入:
            %TagData:目标函数
            %TagFs:采集数据频率
            %MinAbsValue:幅值最小限度
            %Name:图窗名称别
            %NumOrder:选取阶数
            
            %ResFreg:结果频率
            %ResMag:结果幅值
            %ResPhase:结果相位
            
            %% 数据长度
            Length=length(TagData);
            
            %% 计算幅值谱与相位谱
            
            %双边频谱
            FFTTagData =fft(TagData/Length);
            
            %单边频谱
            FFTTagData=FFTTagData(1:Length/2+1);
            
            %幅值谱
            MagTagData = abs(FFTTagData);
            MagTagData(2:end-1) = 2*MagTagData(2:end-1);
            
            %相位谱
            PhaseTagData = [];
            for i = 1:length(FFTTagData)
                if abs(FFTTagData(i))< MinAbsValue
                    PhaseTagData(i) = 0;
                else
                    PhaseTagData(i) = atan2(imag(FFTTagData(i)), real(FFTTagData(i)));
                end
            end
            
            %频率轴
            FreqMagPhase = (0 : length(MagTagData)/(length(MagTagData)-1) : length (MagTagData))*(TagFs/2)/length(FFTTagData);
            
            %时间轴
            Time = (0:Length-1)/TagFs;
            
            %% 截取指定点
            %将频谱数值排序
            [ResMag, IndexMag] = sort(MagTagData, 'descend');
            
            %取前NumOrder阶数
            ResMag = ResMag(1:NumOrder);
            IndexMag = IndexMag(1:NumOrder);
            
            %频率
            ResFreq = FreqMagPhase(IndexMag)';
            
            %相位
            ResPhase = PhaseTagData(IndexMag)';
            
            % 绘制图像 频域
            plot(app.UIAxesFs, FreqMagPhase, MagTagData);
            xlabel(app.UIAxesFs, '频率(Hz)');
            ylabel(app.UIAxesFs, '幅值');
            title(app.UIAxesFs, ['频域-', Name, '-幅值', '选取阶数:', num2str(NumOrder)]);
            hold(app.UIAxesFs, 'on');
            plot(app.UIAxesFs, ResFreq, ResMag, 'r*');legend(app.UIAxesFs, '幅值', '选取点');
            hold(app.UIAxesFs, 'off');
            
            % 绘制图像 时域
            plot(app.UIAxesTime, Time, TagData);
            xlabel(app.UIAxesTime, '时间(s)');
            ylabel(app.UIAxesTime, '幅值');
            title(app.UIAxesTime, ['时域-', Name, '幅值']);
        end
    end

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1926171.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vmware workstation 虚拟机安装

vmware workstation 虚拟机安装 VMware Workstation Pro是VMware&#xff08;威睿公司&#xff09;发布的一代虚拟机软件&#xff0c;中文名称一般称 为"VMware 工作站".它的主要功能是可以给用户在单一的桌面上同时运行不同的操作系统&#xff0c;它也是可进 行开发…

6-7 宠物领养开发及相关代码

6-7 宠物领养开发及相关代码&#xff08;react区块链实战&#xff09; 来到ant-design https://ant.design/index-cn https://ant.design/components/layout-cn/ 来到布局 选择一个简单的布局即可 会显示出所有的相关界面的代码 根据对应界面的代码在我们的react项目woniu-…

接口基础知识3:详解url

课程大纲 一、定义 URL即访问的链接&#xff0c;是Uniform Resource Locator的缩写&#xff0c;译为"统一资源定位符"。 URL是一种URI&#xff0c;它标识一个互联网资源&#xff0c;并指定对其进行操作或获取该资源的方法。可能通过对主要访问手段的描述&#xff0c…

《昇思25天学习打卡营第05天|qingyun201003》

日期 心得 通过本节课的学习&#xff0c;学习到了通过网络获取数据集&#xff0c;处理数据集模型。数据模型层数据变换&#xff0c;模型参数解析和其对应代码中的API进行解析。 昇思MindSpore 基础入门学习 网络构建 (AI 代码解析) 网络构建 神经网络模型是由神经网络层和T…

一篇文章教你如何快速上手Spring MVC框架【万字详解|包含常用注解分析讲解】

目录 一.什么是Spring Web MVC 二.Spring MVC的使用 ▐ 建立连接 RestController RequestMapping ▐ 传递参数 1.简单类型传参 2.类对象传参&#xff08;RequestParam&#xff09; 3.数组&集合传参 4.JSON传参&#xff08;RequestBody&#xff09; 5.URL中的参数…

JavaSE 面向对象程序设计进阶 IO 压缩流 解压缩流

目录 解压缩流 压缩流 解压缩流 压缩包 压缩包里面的每一个文件在java中都是一个ZipEntry对象 把每一个ZipEntry按照层级拷贝到另一个文件夹当中 import java.io.*; import java.util.Date; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream;public cl…

清华计算几何-ConvexHull(凸包)-求极点InTriangle/ToLeft Test

ConvexHull(凸包) 凸包是什么 凸包是计算几何一个非常基础核心的概念。我理解的凸包就是给定一个点集合, 最外围的点的包围体就是凸包。如下所示: 极点(ExtremityPoint) 给定的点集合中, 如果一个点存在一条直线, 让其他所有点都在于该直线的同一侧, 则该点为极点。 非极点 …

【Java--数据结构】栈:不仅仅是数据存储,它是编程的艺术

欢迎关注个人主页&#xff1a;逸狼 创造不易&#xff0c;可以点点赞吗~ 如有错误&#xff0c;欢迎指出~ 目录 栈 栈的方法介绍 入栈push 出栈pop和 瞄一眼peek 判空isEmpty和判满isFull 模拟实现栈 push入栈 pop出栈和peek 测试 使用泛型实现栈 测试 使用链表实现栈&#xff08…

本地部署免费AI大模型+知识库

利用Ollama部署本地大模型 一&#xff1a;终端实现与大模型对话 1.去Ollama官网下载 https://ollama.com/download2.下载之后按照提示一步步安装即可 3.WinR, 输入cmd,打开命令行提示符 输入&#xff1a;ollama run llama3运行大模型 4.使用其他开源大模型&#xff0c;比如…

基于门控循环单元(GRU)的数据回归预测

代码原理 基于GRU&#xff08;Gated Recurrent Unit&#xff09;的数据回归预测通常涉及多输入单输出的情况。以下是简单的原理及流程&#xff1a; 数据准备&#xff1a; 准备多个时间序列作为输入特征&#xff0c;每个时间序列可以表示不同的变量或特征。准备一个目标变量作…

算法学习day12(动态规划)

一、不同的二叉搜索树 二叉搜索树的性质&#xff1a;父节点比左边的孩子节点都大&#xff1b;比右边的孩子节点都小&#xff1b; 由图片可知&#xff0c;dp[3]是可以由dp[2]和dp[1]得出来的。(二叉搜索树的种类和根节点的val有关) 当val为1时&#xff0c;左边是一定没有节点的…

写真图片视频打赏系统源码全开源无加密

这是一款开源的写真图片及视频打赏系统源码&#xff0c;顾名思义他可以做写真图片打赏站也可以做视频打赏站&#xff0c;支付对接了易支付&#xff0c;拥有独立代理后台&#xff0c;全部源码无加密&#xff0c;另外也可以配合付费进群使用。支付扣量、域名防洪这些基本的就不介…

基于信号处理的PPG信号滤波降噪方法(MATLAB)

光电容积脉搏波PPG信号结合相关算法可以用于人体生理参数检测&#xff0c;如血压、血氧饱和度等&#xff0c;但采集过程中极易受到噪声干扰&#xff0c;对于血压、血氧饱和度测量的准确性造成影响。随着当今社会医疗保健技术的发展&#xff0c;可穿戴监测设备对于PPG信号的质量…

修正版头像上传组件

修正版头像上传组件 文章说明核心源码展示运行效果展示源码下载 文章说明 在头像剪切上传一文中&#xff0c;我采用div做裁剪效果&#xff0c;感觉会有一些小问题&#xff0c;在昨天基于canvas绘制的功能中改进了一版&#xff0c;让代码变得更简洁&#xff0c;而且通用性相对高…

Linux的load(负载)

负载(load)是Linux机器的一个重要指标&#xff0c;直观了反应了机器当前的状态。 在Linux系统中&#xff0c;系统负载是对当前CPU工作量的度量&#xff0c;被定义为特定时间间隔内运行队列中的平均线程数。 Linux的负载高&#xff0c;主要是由于CPU使用、内存使用、10消…

[UTCTF2020]babymips

水一篇 32位 c写的&#xff0c;长得比较丑陋 进入sub-401164函数 V7的数据可以得到 unsigned char ida_chars[] {0x62, 0x6C, 0x7F, 0x76, 0x7A, 0x7B, 0x66, 0x73, 0x76, 0x50, 0x52, 0x7D, 0x40, 0x54, 0x55, 0x79, 0x40, 0x49, 0x47, 0x4D, 0x74, 0x19, 0x7B, 0x6A, 0x…

大数据之路 读书笔记 Day5 数据同步遇到的问题与解决方案

回顾 Day 4 数据同步Day 3 无线客户端的日志采集 1. 分库分表的处理 分库分表&#xff08;Sharding&#xff09;是数据库水平扩展的一种策略&#xff0c;当单个数据库的性能和存储能力无法满足应用需求时&#xff0c;可以采用分库分表来分散数据和查询负载。它通常包括两个方面…

钡铼4G无线RTU助力智慧能源发展实现电网远程调控

随着全球对清洁能源和高效能源管理的需求日益增长&#xff0c;智慧能源技术正逐渐成为推动可持续发展的重要驱动力。在这一背景下&#xff0c;钡铼4G无线远程终端单元正在为智慧能源的发展和电网的远程调控提供强有力的支持。 钡铼4G无线RTU&#xff1a;智慧能源的神经网络 钡…

数据恢复篇:适用于 Android 的恢复工具

正在摆弄 Android 设备。突然&#xff0c;您意外删除了一张或多张图片。不用担心&#xff0c;您总能找到一款价格实惠的照片恢复应用。这款先进的软件可帮助 Android 用户从硬盘、安全数字 (SD) 或存储卡以及数码相机中恢复已删除的图片。 Android 上文件被删除的主要原因 在获…

Blender使用(二)点线面基本操作

Blender使用之点线面 1.编辑模式 tab键进行切换&#xff0c;为了方便菜单调出&#xff0c;可以设置键位映射为拖动时的饼菜单。 设置好后&#xff0c;按住tab键移动鼠标(注意不要点击鼠标)&#xff0c;即可弹出编辑菜单。 默认是点模式&#xff0c;在左上角可进行点线面的切换…