夹子音转换器matlab

操作过程点击此处观看
上段时间补习了一下傅里叶变化的知识,突发奇想可以根据此做一款声音转换器,使用工科神器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;%将音频文件写入到wavaudiowrite(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 >= 0TimeRate = 0.4*app.KnobShiftTime.Value + 1;elseTimeRate = 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))< MinAbsValuePhaseTagData(i) = 0;elsePhaseTagData(i) = atan2(imag(FFTTagData(i)), real(FFTTagData(i)));endend%频率轴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, '幅值']);endend

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

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

相关文章

性能测试(2)

jmeter参数化 loadrunner Jmeter IP欺骗&#xff0c;也称为IP欺诈&#xff0c;是指通过伪装、篡改IP地址的方式&#xff0c;进行网络攻击或欺骗行为。这种行为可能会导致网络安全问题&#xff0c;包括身份盗窃、数据泄露、DDoS攻击等。为了保护自己的网络安全&#xff0c;用户…

MySQL-表的约束

文章目录 一、空属性二、默认值三、zerofill四、列描述五、主键删除主键追加主键复合主键根据主键快速索引 六、自增长last_insert_id() 七、唯一键八、外键class表&#xff08;主表&#xff09;student表&#xff08;从表&#xff09; 一、空属性 之前我们将表的机构&#xff…

文心一言:如何备考软考架构师

提问&#xff1a;软考高级:架构师指导&#xff0c;有哪些考点、重点考点有哪些&#xff1f;需要如何备考&#xff1f;案例分析题如何做&#xff1f;论文如何写&#xff1f; 文心一言回答1700字如下&#xff1a; 针对软考高级架构师的考试&#xff0c;以下是对考点、重点考点、备…

DiffusionModel-Transformer知识回顾

论文链接&#xff1a; Attention Is All You Need CNN vs RNN vs Transformer CNN&#xff08;卷积神经网络&#xff09; 特点&#xff1a; 局部连接&#xff1a;每个卷积神经元只与输入数据的局部区域连接&#xff0c;这有助于捕捉局部特征。权重共享&#xff1a;卷积核的权重…

运行在Linux上的程序越来越慢的排查思路

1、通过free -h 排查内存使用情况&#xff0c;是否内存满了 2、通过df -h 排查磁盘的使用情况&#xff0c;磁盘是否没有空间了 3、检查系统资源配置情况&#xff0c;比如使用ulimit -a检查当前会话的资源限制&#xff0c;如最大文件数、打开文件描述符数等&#xff0c;看是否…

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

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

JavaScript进阶(7) ----构造函数和原型对象

目录 构造函数 prototype 定义&#xff1a; 使用场景&#xff1a; constructor 使用场景&#xff1a; 原型proto 原型链 定义 特点 instanceof 运算符 原型继承的基本概念 在JavaScript中&#xff0c;构造函数和原型是面向对象编程的核心概念&#xff0c;它们共同构…

海康工业相机驱动

1.新建基于对话框的MFC程序&#xff0c;界面布局如下 2.修改控件ID&#xff0c;为控件绑定变量 3.创建全局变量&#xff0c;构造函数中初始化变量&#xff0c;初始化对话框界面&#xff0c;补齐各控件按钮响应函数 全文程序如下&#xff1a; // MFC_GrabimageDlg.h : 头文件 /…

【动态规划Ⅰ】斐波那契、爬楼梯、杨辉三角

动态规划—斐波那契系列 什么是动态规划斐波那契数组相关题目509. 斐波那契数 Easy1137. 第 N 个泰波那契数 Easy 杨辉三角118. 杨辉三角 Easy 爬楼梯相关题目70. 爬楼梯 Easy746. 使用最小花费爬楼梯 Easy 什么是动态规划 动态规划是一种通过将原问题分解为相对简单的子问题来…

近期几首小诗汇总-生活~卷

生活 为生活飘零&#xff0c;风雨都不阻 路见盲人艰&#xff0c;为她心点灯 贺中科大家长论坛成立十五周年 科学家园有喜贺 园外丑汉翘望中 曾一学子入我科 正育科二盼长大 憧憬也能入此家 与科学家论短长 园外翘首听高论 发现有隙入此坛 竟然也能注册成 入园浏览惶然立 此贴…

JAVA中的回溯算法解空间树,八皇后问题以及骑士游历问题超详解

1.回溯算法的概念 回溯算法顾名思义就是有回溯的算法 回溯算法实际上一个类似枚举的搜索尝试过程&#xff0c;主要是在搜索尝试过程中寻找问题的解&#xff0c;当发现已不满足求解条件时&#xff0c;就“回溯”返回&#xff0c;尝试别的路径。回溯法是一种选优搜索法&#xff…

[线性RNN系列] Mamba: S4史诗级升级

前言 iclr24终于可以在openreview上看预印本了 这篇&#xff08;可能是颠覆之作&#xff09;文风一眼c re组出品&#xff1b;效果实在太惊艳了&#xff0c;实验相当完善&#xff0c;忍不住写一篇解读分享分享。 TL;DR &#xff08;overview&#xff09; Structured State-Sp…

xshell公钥免密登录

设备&#xff1a;一台linux系统机器&#xff0c;一台windows系统机器 软件&#xff1a;xshell 要求&#xff1a;公钥免密登录 一、生成公钥、私钥 1、打开shell &#xff1b; 点击工具 &#xff1b; 新建用户生成密钥向导 2、生成密钥参数 密钥类型&#xff1a;RS…

element ui ts table重置排序

#日常# 今天带的实习生&#xff0c;在遇到开发过程中&#xff0c;遇到了element ui table 每次查询的时候都需要重置排序方式&#xff0c;而且多个排序是由前端排序。 <el-table :data"tableData" ref"restTable"> </<el-table> <script…

bi项目笔记

1.bi是什么 bi项目就是商业智能系统&#xff0c;也就是数据可视画、报表可视化系统&#xff0c;如下图的就是bi项目了 2.技术栈

Linux rsync文件同步工具

scp的不足 1. 性能问题 单线程传输 SCP只使用单线程进行传输&#xff0c;这意味着在传输大文件或大量小文件时&#xff0c;其传输速度和效率可能不如其他多线程工具。 无法压缩数据传输 SCP不支持内置的压缩机制&#xff0c;这在传输大文件时会导致带宽使用效率较低。 2.…

我花了5年时间训练自己这种能力,希望你也能成功

人生最重要的能力是日拱一卒&#xff0c;即每天做一点点对自己有利的事并持续足够长的时间。作者之前急于求成&#xff0c;减肥失败。同事通过每月改进一件小事成功减肥且知识储备丰富。作者受启发后&#xff0c;通过走楼梯、换代糖等小改变&#xff0c;用 4 年减了 40 斤&…

从头开始搭建一套Elasticsearch集群

前言 刚开始使用ES接触的就是rpm或者是云上提供的ES服务&#xff0c;基本上开箱即用。特别是云上的ES服务&#xff0c;开局就是集群版本&#xff0c;提供的是优化后的参数配置、开箱即匹配访问鉴权及常用插件&#xff0c;如无特殊需要基本上屏蔽了所有细节&#xff0c;直接可投…

深入了解 MySQL 的 EXPLAIN 命令

一、什么是 EXPLAIN 命令&#xff1f; EXPLAIN 命令用于显示 MySQL 如何执行某个 SQL 语句&#xff0c;尤其是 SELECT 语句。通过 EXPLAIN 命令&#xff0c;可以看到查询在实际执行前的执行计划&#xff0c;这对于优化查询性能至关重要。 二、EXPLAIN 的基本用法 要使用 EXP…

如何禁用键盘上的特定键或快捷方式?这里有详细步骤

要禁用特定的键盘键或快捷键吗&#xff1f;微软官方应用程序Microsoft PowerToys使这项任务变得非常简单。以下是使用Microsoft PowerToys中的键盘管理器禁用特定键或快捷方式的快速指南。 如果你还没有安装Microsoft PowerToys 如果你的设备上没有安装Microsoft PowerToys&a…