夾子音轉換器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.pswp.cn/web/45096.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/45096.shtml
英文地址,請注明出處:http://en.pswp.cn/web/45096.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【C++】動態內存分配(關于構造與析構函數的調用)動態數組類 動態創建多維數組 知識點+代碼學習記錄

一.動態內存分配相關知識點 1.堆和棧內存&#xff1a; 堆內存&#xff1a;動態分配的內存位于堆中&#xff0c;它不受作用域限制&#xff0c;由程序員控制其生命周期。 棧內存&#xff1a;局部變量和函數參數等自動分配的內存位于棧中&#xff0c;由編譯器自動管理。 2.new…

性能測試(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…

單例模式java

并發的有序性會導致返回空指針 class A{private static volatil A a;private A(){}public A getInstance(){if(anull){synchronized(A.class){if(anull)anew A();}}return a; }anew A();這條語句&#xff0c;他需要&#xff1a;開辟空間&#xff0c;初始化空間&#xff0c;指針…

python熱門面試題三

面試題1&#xff1a;Python中的列表推導式是什么&#xff1f;請給出一個例子。 回答&#xff1a; 列表推導式&#xff08;List Comprehension&#xff09;是Python中一種非常強大且簡潔的構建列表的工具。它允許你通過一個表達式來創建一個新的列表&#xff0c;這個表達式定義…

無顯卡也可以玩大模型-MiniGPT-4篇

MiniGPT-4學習 1.Colab上部署MiniGPT-42.論文摘要3.模型架構4.模型訓練5.總結 1.Colab上部署MiniGPT-4 代碼&#xff1a; https://github.com/Czi24/Awesome-MLLM-LLM-Colab/blob/master/MLLM/MiniGPT-4-colab/MiniGPT-4.md 2.論文摘要 最近的 GPT-4 展示了非凡的多模式能力&…

【設計模式之美】【建造型】工廠模式:通過面向接口編程思路,串起業務流程

文章目錄 一. 簡單工廠&#xff08;Simple Factory&#xff09;第一種簡單工廠&#xff1a;面向接口編程與工廠類&#xff1a;劃分功能職責第二種&#xff1a;單例簡單工廠&#xff1a;節省內存和對象創建的時間 二. 工廠方法&#xff08;Factory Method&#xff09;&#xff1…

文心一言:如何備考軟考架構師

提問&#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;卷積核的權重…

Android筆記:Constructor (xxx) has been changed after generation.

遇到此報錯時&#xff0c;onstructor (xxx) has been changed after generation.是因為修改了實體類字段后什么都不修改的話就會報這個錯 這條信息是關于代碼生成和代碼變更的警告。當你使用某些工具&#xff08;如注解處理器、代碼生成庫等&#xff09;來自動生成代碼時&…

運行在Linux上的程序越來越慢的排查思路

1、通過free -h 排查內存使用情況&#xff0c;是否內存滿了 2、通過df -h 排查磁盤的使用情況&#xff0c;磁盤是否沒有空間了 3、檢查系統資源配置情況&#xff0c;比如使用ulimit -a檢查當前會話的資源限制&#xff0c;如最大文件數、打開文件描述符數等&#xff0c;看是否…

清華計算幾何-ConvexHull(凸包)-求極點InTriangle/ToLeft Test

ConvexHull(凸包) 凸包是什么 凸包是計算幾何一個非常基礎核心的概念。我理解的凸包就是給定一個點集合, 最外圍的點的包圍體就是凸包。如下所示: 極點(ExtremityPoint) 給定的點集合中, 如果一個點存在一條直線, 讓其他所有點都在于該直線的同一側, 則該點為極點。 非極點 …

如何理解electron 的預加載腳本

在 Electron 應用中,預加載腳本(Preload Script)是一個非常重要的概念,它允許你在渲染進程(web 頁面)和主進程之間創建一個安全的橋梁。預加載腳本運行在 Node.js 環境中,但位于渲染進程的一個單獨的上下文中,這意味著它可以訪問 Node.js 的 API,但無法直接訪問 DOM。…

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 什么是動態規劃 動態規劃是一種通過將原問題分解為相對簡單的子問題來…

linux下解壓命令

在Linux下&#xff0c;解壓縮文件通常涉及多種命令&#xff0c;具體取決于文件的壓縮格式。以下是一些常用的解壓縮命令&#xff1a; tar.gz / .tgz 如果文件擴展名為 .tar.gz 或 .tgz&#xff0c;你可以使用 tar 命令來解壓縮&#xff1a; tar -xzf filename.tar.gz這里的 -x …

近期幾首小詩匯總-生活~卷

生活 為生活飄零&#xff0c;風雨都不阻 路見盲人艱&#xff0c;為她心點燈 賀中科大家長論壇成立十五周年 科學家園有喜賀 園外丑漢翹望中 曾一學子入我科 正育科二盼長大 憧憬也能入此家 與科學家論短長 園外翹首聽高論 發現有隙入此壇 竟然也能注冊成 入園瀏覽惶然立 此貼…

系統架構的基礎:定義、原則與發展歷程

目錄 1. 系統架構的定義 2. 系統架構的基本組成部分 2.1 架構層次 2.2 架構視圖 2.3 架構原則 3. 系統架構的發展歷程 3.1 初期階段:單體架構(Monolithic Architecture) 3.2 面向對象和組件化階段 3.3 客戶端-服務器架構(Client-Server Architecture) 3.4 三層架…

在 Linux 上使用 lspci 命令查看 PCI 總線硬件設備信息

lspci 命令用于顯示 Linux 系統上的設備和驅動程序 當在個人電腦或服務器上運行 Linux 時&#xff0c;有時需要識別該系統中的硬件。lspci 命令用于顯示連接到 PCI 總線的所有設備&#xff0c;從而滿足上述需求。該命令由 pciutils 包提供&#xff0c;可用于各種基于 Linux 和…