精华内容
下载资源
问答
  • 这是一个简单的函数,它根据两个基本输入(总时间和周期)和四个可选输入(绘图选项、最小振幅、最大振幅和分辨率)返回表示方波的值数组。 [f] = squareWave(time,per,plotChk,Amin,Amax,res) 单位是任意的,但...
  • Matlab产生由正弦波产生方波

    千次阅读 2020-12-29 15:23:58
    clc close all clear all ts=0.0001; T = 2/pi; %周期 t=0:ts:2*T; %显示两个周期 f = 1/T; w = 2*pi*f; %f为频率 y = 0; for i = 1:2:17 %叠加1 3 5 7。。。17次波形 y = y + sin(i.*w.*t)./(w*i);...plot(t, y)
    clc
    close all
    clear all
    
    ts=0.0001;
    T = 2/pi; %周期
    t=0:ts:2*T; %显示两个周期
    f = 1/T;
    w = 2*pi*f; %f为频率
    y = 0;
    for i = 1:2:17 %叠加1 3 5 7。。。17次波形
        y = y + sin(i.*w.*t)./(w*i);%波形叠加
    end
    plot(t, y)
    

     

    展开全文
  • 结束了朝七晚十二的生活后,最近几天好好放纵了...Tzvi讲过,我们Matlab只学一个学期的基础,后面因为不同人的发展方向不同,所以只能靠学习基础的方式自行学习你需要用到的内容。所以今天要摸的是Matlab里有关于s...

    结束了朝七晚十二的生活后,最近几天好好放纵了一下,把库存里的还没玩的游戏都玩完或者玩到卡关,把想再看一遍的书又看了一遍,奢侈地睡了个觉。但是看了看开学时间不断地逼近,计划却只完成了那么几个,心里着实不甘。于是又来敲键盘了。

    Tzvi讲过,我们Matlab只学一个学期的基础,后面因为不同人的发展方向不同,所以只能靠学习基础的方式自行学习你需要用到的内容。所以今天要摸的是Matlab里有关于sound的内容(Matlab的功能真的很杂,它甚至还有FM Broadcast Receiver)

    《Mastering MATLAB》里关于SOUND的介绍非常少,只有短短两页内容,可见在Matlab里,sound并不是什么主要内容或者说是弱项。sound在matlab里更多的并不是用于制作音乐,而是提醒和分析声音背后的数学,物理规律

    为什么说是提醒呢,因为有些比较复杂的程序,往往需要matlab运算很久才会有结果,这时候人一般是不会盯着屏幕等着出结果,而是走开先去干其他事。这时候就需要matlab在运算完后发出提示,最好是声音。所以sound在matlab里更多是用于提醒程序已运行完,结果已得出(一般用beep函数)。不过也有人用warndlg(弹出窗口)来提醒

    在《Mastering MATLAB》里这部分内容,似乎把函数分成了high-level functions (audioplayer, audiorecorder, getaudiodata, audiodevinfo...) 和 lower-level functions (sound, soundsc, auread, wavread, auwrite, lin2mu...)。但我觉得分高低级并没有什么用

    还是从头开始尝试,就从怎么播放系统自带的音频开始吧

    其实matlab自带了很多声音,除了我们刚刚在上面提到的我们用matlab经常能听到的beep之外,还有chirp(叽叽喳喳的鸟叫声), gong(铜鼓), handel(哈雷路亚), laughter, splat(东西掉下来的啪嗒声), train。这些东西都是mat文件,位置在

    "MATLAB/R2018b/toolbox/matlab/audiovideo"

    f1941b9aeb9449b50178df65942371f5.png

    我们可以通过以下函数来播放

    load chirp; %读取chirp.mat文件

    sound(y,Fs); %播放以y为样本,Fs为频率的声音

    还可以这么写

    load train;

    player = audioplayer(y,Fs); %创建用于播放音频的对象

    play(player);

    load我们应该都能看懂,就是读取文件,而mat文件就是matlab自带的数据包文件格式。sound(y,fs)就是播放以y为样本,fs为采样频率的声音;与之相对的是play,它可以从 audioplayer 对象播放音频。audioplayer就是创建用于播放音频的对象

    c8ac08bdf7e3ca13430cd9d13dee3cc3.png

    audioplayer对象长这样

    其中fs采样频率以Hz为单位,指的是采所有的样本,但是一秒内采fs个样本。必须有震动,即变化,或者说是波才能形成声音,所以当样本全为同一个值的时候,不管这个值有多大,它都是没有声音的,只有在值出现变化的时候,才会有声音

    嗯嗯,你们动手试试吧,这些声音都挺有趣的

    然后我们看回我刚刚放的第一张图,里面箭头的是系统自带的包含音频信息的mat文件,方形的是敲琴视频,还有圆圈圈出来的是matlab的一个彩蛋。比较神奇的是,唯独这个mat文件的频率Fs(7418)和其他mat的频率(8192)不一样,而且其他的样本数据名字都是y,唯独它是叫mtlb。有兴趣的朋友可以自己去试试这个彩蛋

    我们现在看到的都是已经从音频文件转为mat的文件了,那如果我们自己要转换怎么做呢?这时候就需要audioread函数了

    首先要把你要转换的音频文件放在当前目录里,当前目录你可以用pwd函数,看看是在哪里,或者直接看上面

    5b230ae3b4c173cd50bd80282e09316e.png

    比如我把一个叫night.mp3的文件,放在当前目录,然后就可以使用函数了

    [y,fs] = audioread('night.mp3'); %读取音频文件,并输出到工作区的"y","fs"

    sound(y,fs);

    这时候我们发现,工作区出现了"fs","y"这两个数据,同时电脑还缓缓播放出好听的音乐。这里的"fs"就是这个音频的频率,"y"就是音频数据,而且"y"还是一个nx2的double,为什么是2呢,因为现在大多数音频文件都是双声道了啊。再补充一点,还有一个函数叫做soundsc,它可以缩放音频信号 y 的值以使其位于 –1.0 到 1.0 范围内,尽可能提高音频的音量,而不用裁剪

    1f64fd11330952dd6cea28424f281f98.png

    然后我们就可以点右上角的小三角形,对工作区进行保存

    831d3232854f546161378d41b956f270.png

    现在我们可以把原来的mp3文件和新的mat文件进行对比,就可以发现,这么做是非常的不划算的,文件大小一下子大了21倍。毕竟mat不是专门用来储存音频信息的,情有可原

    a45b0f5a08c52990e70f9e79caf760ad.png

    没什么卵用不要紧,主要是这样可以装逼,不是吗。找个好友,发给已经转化过音频的mat文件给ta。"你下载这个文件后,打开matlab,把这个mat文件放在当前目录,然后在命令窗口输入以下代码:"

    load night;

    sound(y,fs);

    看到这么大的文件,这么简洁的代码,不会让人觉得一头雾水的很厉害吗,就是没什么用而已,还不如直接听mp3

    想要逼格再高一点,就把它做成刚刚讲的audioplayer对象,这样连样本数据也看不见了

    75bd2c34cd9dbea98b2e12fd5688c55e.png

    SampleRate就是它的采样频率,相当于"fs",数值越高就相当于波被压缩了一样,声调变高,时间变短。说到了变速和变调,我们顺便也提提"变速不变调"和"变调不变速"两种。变速不变调,需要你把样本数据值压缩成二分之一,然后用2*fs的采样频率播放。而变调不变速,需要你把样本长度增长一倍,然后用2*fs的采样频率播放。

    BitsPerSample就是它的比特率,声音中的比特率是指将模拟声音信号转换成数字声音信号后,单位时间内的二进制数据量,是间接衡量音频质量的一个指标

    NumberOfChannels就是它的频道数,相当于我们"y"的column值。TotalSamples就是我们现有样本总数,相当于"y"的row值

    刚刚也说明了,play播放的是audioplayer对象;sound播放的是以fs为频率,y为样本的声音。再细点讲,audioplayer相对于直接使用sound,可操作的地方多很多

    比如说你播放sound,想要停的话,你就输入

    clear sound;

    不过你也只能停止sound的播放,而对于audioplayer你可以play(播放),pause(暂停),resume(继续播放),stop(停止),还有get, set(设置属性), isplaying, playblocking等,格式写成

    play(playerObj);

    pause(playerObj);

    resume(playerObj);

    stop(playerObj);

    ... ...

    playerObj填入audioplayer对象的名称

    另外,play还可以截取audioplayer对象的部分进行播放,格式为

    play(playerObj,start);

    play(playerObj,[start,stop]);

    里面的start或stop应该如此赋值

    start = playerObj.SampleRate * 4;

    这个意思是start是playerObj的从前往后数的第四秒。因为想要取我们要的这个位置的值,除了和时间,还和播放它的采样频率有关,两者乘起来才是我们要的开始样本数据的值。就好比我们要接这么多的水,除了和接水的时间有关,还和开水龙头的大小有关

    此外,我们可以看见audioplayer对象下面包含了许许多多的数据,我们想要单独使用某个值的时候,格式就是"对象名.子数据名"。比如我们要取我们刚刚创建的名为"player"的audioplayer对象里的"BitsPerSample"就写作"player.BitsPerSample"

    把这个整合起来就是这么写

    load handel.mat;

    player = audioplayer(y,Fs);

    start = player.SampleRate * 4;

    play(player,start);

    我们可以发现,handel这个音频从第四秒(start)开始播放。stop也是一样的道理

    另外play是可以一次性播放许许多多个音频的,没有排他性,这样会听起来很嘈杂(sound也没有排他性)。用playblocking替代play就可以解决这个问题,这是一个具有排他性的函数,即它会播放一个音频完后再播放下一个

    能播就能录,这时候用的函数是audiorecorder,这个函数可以创建用于录音的对象,格式为

    recorder = audiorecorder

    recorder = audiorecorder(Fs,nBits,nChannels)

    Fs为以Hz为单位的采样率,MATLAB 的硬性限制为 1000 Hz <= Fs <= 384000 Hz,默认: 8000。nBits为采样位数,默认: 8。nChannels为通道数:1(单声道)或 2(立体声),默认: 1

    Matlab说明文档的示例如下

    % Record your voice for 5 seconds.

    recObj = audiorecorder; %创建audiorecorder对象

    disp('Start speaking.')

    recordblocking(recObj, 5); %排他性地单独对recObj这个对象录5s的音

    disp('End of Recording.');

    % Play back the recording.

    play(recObj); %播放recObj

    % Store data in double-precision array.

    myRecording = getaudiodata(recObj); %将recObj导出为数据并赋值给myRecording

    % Plot the waveform.

    plot(myRecording); %画myRecording的图像

    这个例子特别好,比较全面。讲了创建,录音,转为数据,画图几个方面。这里面的recordblocking也可以用record代替。也就是说,audioplayer - play - playblocking三者的关系和audiorecorder - record - recordblocking三者的关系类似。然后我就随便瞎哼哼,导出了个图像(这段我录了10s,但是已经有80000个数据。)

    cabec0dffc72d0ab0b85f34ff6c5c6f6.png

    可以播可以录,也就可以保存了,使用函数audiowrite,格式为

    audiowrite(filename,y,Fs)

    这里filename的格式可以写为这么几种

    'myFile.m4a'

     '../myFile.m4a'

    'C:\temp\myFile.m4a'

    比如说保存我们刚刚的录音为wav文件

    audiowrite('mysound.wav',myRecording,8000); 

    %这里的8000就是recObj.SampleRate

    然后你就可以在你的文件夹里看见你导出的wav文件了

    41663bd94f24f95c36c589c8fb253984.png

    它支持的格式和通道数有

    eb8a70b9014ae67db23461b61379ad42.png

    还有一个函数叫做audioinfo,它可以帮你查看有关于audio的信息,比如

    info = audiodevinfo

    84adaf87ed693332e93c3fd91f7b56d4.png

    还可以这么写

    audioinfo('mysound.wav')

    c47fcda220ec65405b82ca49a0e1edd8.png

    不知道你是否知道Mu-Law

    μ-law(或Mu-Law)作为一种压缩扩展的方法,μ-law可以改善信噪比率而不需要增添更多的数据。

    均匀量化时 ,由于对编码范围内小信号或大信号都采用等量化级进行量化 ,因此小信号的“信号与量化噪声比”小 ,而大信号的“信号与量化噪声比”大 ,这对小信号来说是不利的。为了提高小信号的信噪比 ,可以将量化级再细分些 ,这时大信号的信噪比也同样提高 ,但这样做的结果使数码率也随之提高 ,将要求用频带更宽的信道来传输。采用压缩的量化特性是改善小信号信噪比的一种有效方法。它的基本思想是在均匀量化前先让信号经过一次处理 ,对大信号进行压缩而对小信号进行较大的放大。由于小信号的幅度得到较大的放大 ,从而使小信号的信噪比大为改善。

    信噪比,英文名称叫做SNR或S/N(SIGNAL-NOISE RATIO),又称为讯噪比。是指一个电子设备或者电子系统中信号与噪声的比例。这里面的信号指的是来自设备外部需要通过这台设备进行处理的电子信号,噪声是指经过该设备后产生的原信号中并不存在的无规则的额外信号(或信息),并且该种信号并不随原信号的变化而变化。

    同样是“原信号不存在”还有一种东西叫“失真”,失真和噪声实际上有一定关系,二者的不同是失真是有规律的,而噪声则是无规律的。

    ——百度百科

    部分相关内容,你还可以通过下面这个视频进行了解

    【作死物理小讲堂】高音质的音频是如何录制的 音频增益与降噪的原理 @FPS罗兹 灵魂字幕

    https://www.bilibili.com/video/av16759300

    Matlab就有这么一个函数可以将linear audio转化为mu-law,叫lin2mu,相反则用mu2lin。mu = lin2mu(y) 将范围 -1 ≤ Y ≤ 1 内的线性音频信号振幅转换为范围 0 ≤ u ≤ 255 内的 mu-law 编码"flints"

    Matlab不能直接打开mp3,wma等我们经常会用到的音频文件格式,但是在《Mastering MATLAB》有提到以下内容

    Two industry-standard sound file formats are supported in MATLAB. NeXT/Sun audio format (file.au) files and Microsoft WAVE format (file.wav) files can be written and read.

    ——《Mastering MATLAB》

    那个au格式不讲,我没见过,不过使用方式和wav很像。与wave相关的函数有四个,分别是:

    wavplay Plays WAVE format sound file (depreciated; use audioplayer instead)

    wavrecord Records sound using audio input device ( depreciated; use audiorecorder instead)

    wavread Reads WAVE format sound file

    wavwrite Writes WAVE format sound file

    ——《Mastering MATLAB》

    又是不建议使用的函数,在MATLAB Release Notes里也指出来了这几个函数不建议使用

    2aaf67ac388a9db48e750826c154ebee.png

    ——R2014a - Data Import and Export - Functionality being removed or changed

    这些函数很早就不建议使用了,从13到15几个版本的Release Notes连续提出警告,然后你在matlab文档里也找不到这几个函数的具体介绍文档,应该是不可以使用了。我看了一下《Mastering MATLAB》的发行时间,2012,哦,好吧

    但是!但是我却在百度文库看到一篇挺新的文章还在用这几个函数

    0ec459f137135a1dfe2e28b6df78d2c6.png

    我有点好奇,毕竟可能只是提醒不建议,而不是完全不能用了。所以我自己打了代码试试看。这红线?看来不行。运行了,果然不行(这里我的换行打错了,得fprintf才能用\n)

    08de3432a582c6a16c5c230c37834b7c.png

    ee43070c6192717bea6369e27d18b51b.png

    好了,说了这么多,除了录音之外,基本上都是现有的东西,那可不可以自己做呢?比如编辑音乐?有是有,虽然不如专用的MuseScore或者GarageBand等好用

    这部分内容需要很多比较基础的乐理知识,其中也包含了不少数学和物理的美妙,有兴趣的朋友可以去了解了解

    我知道的,写得比较好,比较全的有下面几个

    十二平均律理论的科学依据是什么?

    https://www.zhihu.com/question/27345554

    写给理工科人看的乐理(四)和弦与调式

    http://www.cnblogs.com/devymex/p/3386886.html

    纯律、五度相生律和十二平均律有何关系?

    https://www.zhihu.com/question/20612595

    如何通俗易懂地解释八度与十二平均律?

    https://www.zhihu.com/question/22822711

    听听函数,看看声音--Matlab的sound()函数

    https://blog.csdn.net/weaponsun/article/details/46695255

    黑白键的故事 | 混乱博物馆

    https://zhuanlan.zhihu.com/p/37546103?utm_source=wechat_session&utm_medium=social&utm_oi=863156048981295104

    (感谢kj同学的推荐)

    音高和频率转换表

    https://wenku.baidu.com/view/ed84865e1711cc7931b716bc.html

    使用matlab进行简单音乐合成

    https://wenku.baidu.com/view/1a4428010740be1e650e9a4d.html

    我们可以看到,声音的音高跟它的频率有关,它们之间符合以下公式关系

    e233d567c83109c00c91ea5b393f540a.png

    其中p为MIDI number(亦可以理解为音高),f为频率(Hz)。一般定钢琴上小字一组的la(a1)为标准音,p=69,f=440。这样推算过来,中央C(do c1)的p=60,f=261.63

    081550417e981b37225b8d21d4a0031f.png

    http://newt.phys.unsw.edu.au/jw/notes.html

    我没看懂这个图的note name在写什么,因为一般我们都是下图这么标的

    38942599578ae5301d40fc2c0ec89855.png

    baby.bao-jian.net

    还有我不太明白他这个p是怎么定义的,所以我看到有人拿钢琴键当做p写进公式的时候,我对照着标准公式看了很久,才知道ta写的不是标准公式,而是把p换做钢琴键数(好吧,它有写很清楚,只是我比较蠢)

    2c86f3570aa467632849c344a4a2a167.png

    上面的问题用下图可能比较好理解

    1dcd7074063fb51b3b1c052a73a49745.png

    https://blog.csdn.net/weaponsun/article/details/46695255

    fs=44100;

    t=0: 1/fs: 0.5; %因为采样频率为fs,所以我们要提供的数据的间距为1/fs

    do=sin(2*pi*261.63 *t); 

    re=sin(2*pi*293.66 *t); 

    mi=sin(2*pi*329.63 *t); 

    fa=sin(2*pi*349.23 *t); 

    so=sin(2*pi*392.00 *t); 

    la=sin(2*pi*440.00 *t); 

    ti=sin(2*pi*493.88 *t); 

    Cscale=[do,re,mi,fa,so,la,ti];

    sound(Cscale,fs)

    ——听听函数,看看声音

    --Matlab的sound()函数

    我们可以发现这段音乐失真的很严重,需要修正。这是因为而我们一般听到的声音都有始有终,从小到大,再从大到小,不会一下子就最大声。简单来说,这里失真就是因为发声瞬间数值的差值太大了,即相位不连续,产生高频分量。这里的每一个声音都是从头到尾都是同一个振幅,我们需要通过一个修正振幅来调整它们,比如说这里的修正振幅就可以写作

    mod = sin(pi*t/t(end)); % Modification function

    使其每一个音都是一个小山丘的发声形式,就跟我们弹钢琴一样,敲下按键的那一瞬间,声音变大,手指离开按键的时候,声音变小,而按到底的时候声音最大。这些整合起来如下

    fs = 44100;

    t = 0:1/fs:0.5;

    mod = sin(pi*t/t(end));

    do = mod .* sin(2*pi*261.63 *t); 

    re = mod .* sin(2*pi*293.66 *t); 

    mi = mod .* sin(2*pi*329.63 *t); 

    fa = mod .* sin(2*pi*349.23 *t); 

    so = mod .* sin(2*pi*392.00 *t); 

    la = mod .* sin(2*pi*440.00 *t); 

    ti = mod .* sin(2*pi*493.88 *t); 

    Cscale=[do,re,mi,fa,so,la,ti];

    sound(Cscale,fs);

    你再运行试试看,是不是就没有了"塔塔塔"的破音

    还有一种调幅的方式叫做包络函数

    mod = (t.^4).*exp(-30*(t.^0.5)); 

    mod = mod*(1/max(mod)); 

    详情请看

    matlab演奏最炫民族风的代码求翻译,越详细越好,真心看不懂?

    https://www.zhihu.com/question/20248007

    我们除了可以用各个音高的频率来表示声音,还可以通过五度相生律来推每个音。详细内容请看上面的"黑白键的故事"那个链接

    7cebd4f7d644e9a10334b001fdc63c9b.png

    http://blog.csdn.net/bat67

    很多采样频率fs都是44100Hz,这是因为这个是理论上CD音质的界限(据说是通过"乃奎斯特取样定理"选定的),而最先很多mp3都是从CD拷来,所以我们会有很多音频文件的采样频率都是44100Hz。而高于48KHz的采样率,人耳分辨不出来,也就没多大用处了。但是我还是不明白matlab默认的采样频率8192是怎么来的

    另外还需提前提出来的是,现在你去看别人用matlab编写的音乐,它们的十六分音符时长都为0.125s

    7ba4b97398164dbefa584da1143fcbc1.png

    这是因为它们曲子的BPM(Beat Per Minute,拍子数,每分钟节拍数的单位。一般琴谱左上角一个四分音符等于某个数值指的就是BPM)都为120,即一分钟有120拍,四分音符为一拍,所以一拍0.5s,而十六分音符就是0.125s

    76995c92fa9cd7592875ef43705929bf.png

    zhidao.baidu.com

    所以我们可以总结一下,一般在matlab里制作编写音乐的流程如下

    1.定义采样频率

    fs = 44100;

    dt = 1/fs; %每个采样点的时间差

    2.定义BPM(挺多程序定义的是十六音符,然后通过十六分音符推出其他音符)

    T16 = 0.125;

    t16 = 0:dt:T16; %每个采样点的时间点

    [~ k] = size(t16);

    %我们想知道十六音符的采样个数,这个会在后面设置休止符的时候用到。因为没必要知道第一个元素的数值,所以我们可以直接用"~"代替。不过这里也可以写成"k = size(t16,2);"

    t4 = linspace(0,4*T16,4*k);

    %这个是由十六分音符推四分音符。linspace可以生成线性间距向量,y = linspace(x1,x2,n) 生成 n 个点。这些点的间距为 (x2-x1)/(n-1)。

    [~ i] = size(t4);

    ... ...

    3.定义每个音,要分音高和时长

    (上面已经给出直接用频率写的音符,和用五度相生律推的音符两种方法)

    4.定义休止符和整合旋律

    5.如果有多个旋律,要把这些旋律的数据加起来,然后归一化,防止失真

    比如说你有旋律m1, m2, m3,你需要

    y = m1+m2+m3;

    y = y/max(y); 

    %归一化,压缩数值,使之最大值的绝对值为"1",防止失真。这个主要还是因为sound(y,fs)里的y要求是-1到1之间的数值。不过这个问题也可以用soundsc函数解决

    6.播放

    sound(y,fs);

    了解完这些后,我们就可以开始着手编写自己的音乐了

    297f812af24cfed3c8476758175f7c86.png

    《那些年,我们一起弹的钢琴曲》

    我们可以看到,这个曲子的BPM是100,而不是120。所以一拍就是0.6s而不是0.5s了

    379d39569b8dde0a9735611880acd11d.png

    8bddd87788bd4531cda9312068d16acd.png

    这段播放出来就是开头的那个语音。想要我制作《一生有你》的编曲m文件的朋友,可以在我的公众号后台发送"一生有你"

    matlab里,sound的相关内容还有许许多多可以讲的东西。有兴趣的话,还可以看看别人怎么做随机音乐

    [实习] 用matlab生成随机序列音乐

    https://www.douban.com/group/topic/12214892/

    另外为了感谢能够从头看到尾的朋友,我决定送上点福利,去Numerical computing with functions 这个官网上免费下载,或者在网址那里输入

    https://link.zhihu.com/?target=https%3A//github.com/chebfun/chebfun/archive/master.zip

    下载完后,把文件解压,打开解压的文件(变为当前目录)就开始开心的耍了。在命令窗口分别输入以下三个代码,在matlab上玩三种贪吃蛇

    chebsnake

    chebsnake('equi')

    chebsnake2

    写一篇推文不容易,希望大家观看,收藏,投币三连(doge),谢谢!

    展开全文
  • 从正弦波转换为方波(傅里叶验证) 此示例说明方波的傅里叶级数展开式是如何由奇次谐波的和构成的。 1.首先以 0.1 为步长,生成一个从 0 到 10 的时间向量,并求出所有点的正弦。绘制基频图 t = 0:.1:10; y = sin(t); ...

    从正弦波转换为方波(傅里叶验证)

    此示例说明方波的傅里叶级数展开式是如何由奇次谐波的和构成的。

    1.首先以 0.1 为步长,生成一个从 0 到 10 的时间向量,并求出所有点的正弦。绘制基频图

    t = 0:.1:10;
    y = sin(t);
    plot(t,y);
    

    在这里插入图片描述
    2.接下来,向基频添加第三个谐波,并绘制谐波图

    y = sin(t) + sin(3*t)/3;
    plot(t,y);
    

    在这里插入图片描述
    3.接下来使用第一、第三、第五、第七和第九个谐波

    y = sin(t) + sin(3*t)/3 + sin(5*t)/5 + sin(7*t)/7 + sin(9*t)/9;
    plot(t,y);
    

    在这里插入图片描述
    4.最后,从基频开始创建更多连续谐波的向量,一直到第 19 个谐波为止,并将所有中间步长保存为矩阵的行。

    在同一个图窗中绘制这些向量,以便显示方波的演变。请注意,吉布斯效应表明它实际上永远不会转换为方波。

    t = 0:.02:3.14;
    y = zeros(10,length(t));
    x = zeros(size(t));
    for k = 1:2:19
       x = x + sin(k*t)/k;
       y((k+1)/2,:) = x;
    end
    plot(y(1:2:9,:)')
    title('The building of a square wave: Gibbs'' effect')
    

    在这里插入图片描述
    5.下面提供了一个三维曲面图,该曲面图表示正弦波到方波的逐变过程

    surf(y);
    shading interp
    axis off ij
    

    在这里插入图片描述

    展开全文
  • 二、实验原理1、周期信号的分解根据傅里叶级数的原理,任何周期信号都可以表示为三角级数的组合称为f(t)的傅合成波形所包含的谐波分量越多,除间断点附近外,它越接近于原波形,在间断点附近,即使...

    基于MATLAB仿真的连续信号频谱分析.doc.doc

    实验十:基于MATLAB仿真的连续信号频谱分析

    一、实验目的

    1、学会运用MATLAB求连续时间信号的傅里叶变换;

    2、学会运用MATLAB求连续时间信号的频谱图。

    二、实验原理

    1、周期信号的分解

    根据傅里叶级数的原理,任何周期信号都可以表示为三角级数的组合称为f(t)的傅

    合成波形所包含的谐波分量越多,除间断点附近外,它越接近于原波形,在间断点附近,即使合成的波形所含谐波次数足够多,也仍存在约9%的偏【示例1】用正弦信号的叠加近似合成一个频率为50Hz,幅度为3的MATLAB程序如下:

    clear all;

    fs=5000;

    t=0:1/fs:0.1;

    f0=50;sum=0;

    subplot(211)

    for n=1:2:9

    plot(t,4/pi*1/n*sin(2*pi*n*f0*t),'k');

    hold on;

    end

    title('信号叠加前');

    subplot(212)

    for n=1:2:9;

    sum=sum+4/pi*1/n*sin(2*pi*n*f0*t);

    end

    plot(t,sum,'k')

    10.1所示。

    2、非周期信号的频谱分析

    信号的傅里叶变换定义为

    (.1)

    傅里叶反变换定义为

    (.2)

    信号的傅里叶变换主要包括MATLAB符号运算和MATLAB数值分析两种方法。

    (1) MATLAB符号运算求解法

    MATLAB符号数学工具箱提供了直接求解傅里叶变换和傅里叶反变换的函数fourier( )及ifourier( )。傅里叶变换的语句格式分为三种。

    F=fourier(f );表示符号函数f的Fourier变换,默认返回是关于的函数。

    F=fourier(f ,v);表示返回函数F是关于符号对象v的函数,而不是默认的,即。

    F=fourier(f ,u,v); 是对关于u的函数f进行变换,返回函数F是关于v的函数,即。

    类似的,傅里叶反变换的语句格式也分为三种。

    要注意的是,函数fourier( )及ifoureir( )都是接收由sym函数所定义的符号变量或者符号表达式。【2】用MATLAB符号运算求解法求单边指数信号的傅里叶变换。

    解:MATLAB源程序为

    >> ft=sym('exp(-2*t)*Heaviside(t)');

    >> Fw=fourier(ft)

    运行结果为

    Fw =

    1/(2+i*w)

    (2) 连续时间信号的频谱图

    信号f(t)的傅里叶变换表达了信号在处的频谱密度分布情况,这就是信号的傅里叶变换的物理意义。一般是复函数,可以表示为。我们把与曲线分别称为非周期信号的幅度频谱和相位频谱。

    【3】用MATLAB命令绘制单边指数信号幅度谱和相位谱。

    解:MATLAB源程序为

    ft=sym('exp(-2*t)*Heaviside(t)');

    Fw=fourier(ft);

    subplot(211)

    ezplot(abs(Fw),[-2*pi,2*pi]),grid on

    title('幅度谱')

    phase=atan(imag(Fw)/real(Fw));

    subplot(212)

    ezplot(phase,[-2*pi,2*pi]),grid on

    title('相位谱')

    程序运行结果如图.2所示。

    (3)MATLAB数值计算求解法

    Fourier( )和ifourier( )函数的一个局限性是,如果返回函数中有诸如狄拉克函数等项,则用ezplot( )函数无法作图。对某些信号求变换时,其返回函数可能包含一些不能直接用符号表达的式子,甚至可能出现提示“未被定义的函数或变量”,因而也不能对其返回函数作图。此外,在很多实际情况中,尽管信号是连续的,但经过抽样所获得的信号则是离散的数值量,因此无法表示成符号表达式,此时不能应用Fourier( )函数对进行处理,而只能用数值计算法来近似求解。下面介绍傅里叶变换的数值计算法。

    从傅里叶变换定义出发,有

    (3)

    当足够小时,上式的近似情况可以满足实际需要。对于时限信号,或者在所研究的时间范围内衰减到足够小,上式可研究有限n的取值。假设是因果信号,则有

    (4)

    对(4)式的角频率进行离散化,假设离散化后得到N个样值,即

    , (5)

    因此有

    采用行向量,用矩阵表示为

    (6)

    式(6)提供了用MATLAB实

    展开全文
  • 周期性矩形波(方波)信号:在MATLAB中用square函数来表示,其调用形式为 y=square(t,DUTY) 其作用类似于sin(t),用以产生一个时长为t、幅值为±1的周期性方波信号,其中的DUTY参数表示占空比,即在信号...
  • matlab中方信号的谐波表示

    千次阅读 2020-07-05 13:10:32
    matlab中方波信号的谐波表示 一.数学运算 二.matlab代码 t=-7:0.001:7; %x(t)中t取值范围为【-7,7】 T1=1; T=4; w=2*pi/T; a0=2*T1/T; N=input('请输入谐波数...三....很明显谐波数越多,近似效果越好,越趋近方波 ...
  • matlab的square函数绘制方波方法

    千次阅读 2021-03-22 21:36:53
    square函数调用方法及参数含义 注:以下代码为matlab代码 t=-0.0625:0.0001:0.0625; # 横轴显示区间范围 y=A*square(2*pi*50*t,75); # A为幅值,75表示占空比 plot(t,y),grid on ...T为方波周期 ...
  • MATLAB 做三角波嵌方波(新手使用)

    千次阅读 2021-02-28 06:38:09
    Matlab 三角波嵌方波 众所周知,matlab是一个款强大的数学工具,在这里主要演示三角波嵌方波程序来对matlab绘图快速入门。 首先了解matlab是怎样画一条函数曲线的 比如我想画一条cos函数曲线,函数表达式为y=2*cos(2...
  • matlab产生方波脉冲和周期性方波信号

    万次阅读 多人点赞 2017-02-23 17:06:19
    周期性矩形波(方波)信号:在MATLAB中用square函数来表示,其调用形式为 y=square(t,DUTY) 其作用类似于sin(t),用以产生一个时长为t、幅值为±1的周期性方波信号,其中的DUTY参数表示占空比,即在信号的一个周期...
  • MATLAB生成周期方波信号:square 函数使用简记

    千次阅读 多人点赞 2020-07-09 20:43:46
    square函数用于生成周期方波信号,其调用语法如下。 1.f=square(a*t):生成指定周期、峰值为±1的周期方波,常数a为信号时域尺度因子,用于调整信号周期。当a=1时,周期为2pi、峰值为±1的周期方波。 2.f=square...
  • MATLAB中产生周期方波信号

    千次阅读 2021-06-22 22:08:32
    用以产生一个时长为t、幅值为±A的周期方波信号,其中的参数w表示占空比(即在信号的一个周期中正值所占的百分比)。 参考程序: clc;clear; t = 0:1:100; w=50; y=square(0.5*t,w); plot(t,y); ylim([-6.5 ...
  • 产生一个时长为t、幅值为±1的周期性方波信号,其中的DUTY表示占空比,即在信号的一个周期中正值所占的百分比; t=-2*pi/100:pi/500:2*pi/100; y=square(2*pi*25*t,50); plot(t,y); 2 三角波 三角波信号的产生...
  • Matlab 周期方波信号傅里叶级数展开

    千次阅读 2019-09-24 23:14:14
    方波信号为: 傅里叶级数展开为: 程序运行结果: 程序代码: 1 clear 2 3 x = -6:0.01:6; 4 T = 4; 5 6 f = x; 7 for N = 1:length(f) 8 temp = rem(abs(x(N)),T); 9 if temp>1 ...
  • 基于MATLAB的小阈值去噪

    万次阅读 多人点赞 2016-11-14 17:01:01
    非常感谢: ... http://blog.chinaaet.com/detail/3083.html MATLAB中实现了信号的阈值去噪,主要包括阈值去噪和阈值获取两方面。1.阈值获取MATLAB中实现阈值获取的函数有ddencmp、thselect、wbmpen和wwdcbm,下面对它
  • 方波通过RC滤波器波形-Matlab仿真

    千次阅读 2020-11-26 00:06:05
    Matlab代码如下: %参数设置 R=100/(2*pi); %电阻值,2*pi只是为了方便是截止频率为整数 C=0.01; %电容 Fc=1/(2*pi*R*C); %RC滤波器的截止频率 ... %方波频率1Hz ... %方波的各个谐波的系数 单行矩阵
  • 周期信号的傅里叶级数分解(以方波为例) 1、什么是周期信号? 周期信号是经过一定时间可以重复的信号,满足条件:x(t)=x(t+nT);n=1,2,3,4,… 其中,T称为信号的周期,其倒数f=1/T为信号的频率。 2、周期信号的三角...
  • 计算方波信号的傅里叶变换,方波宽度自定义(提示:可用单位阶跃信号表示方波信号)
  • matlab实现可调节占空比的方波

    千次阅读 2017-04-08 20:47:00
    我大概讲一下实现的原理:...结果上图,可以实现调节占空比,方波频率,方波个数。 下面是函数的代码: function y=squarewav(Vm,f,K,n) %参数为幅度,频率,占空比,以及波形个数 % 正弦信号 % f = 1000;...
  • matlab人脸识别论文

    万次阅读 多人点赞 2019-10-11 17:41:51
    主元分析(PCA)方法是一种有效的特征提取方法,将人脸图像表示成一一个列向量,经过PCA变换后,不仅可以有效地降低其维数,同时又能保留所需要的识别信息,这些信息对光照、表情以及姿态具有一定的不敏感性。...
  • %方波的频率t=0:.01:10;f=@(t) square(2*pi*f时间:2019-6-20刚学matlab,clear,clcf0=1;%方波的频率t=0:.01:10;f=@(t) square(2*pi*f0*t);square(2*pi*f0*t);figure,plot(t,square(2*pi*f0*t)),...
  • MATLABMATLAB的基础知识

    千次阅读 多人点赞 2017-04-12 11:52:00
    MATLAB的启动和退出1.MATLAB的启动有如下两种方式: 方式一:双击操作系统桌面上的MATLAB快捷方式,即可启动并打开MATLAB命令窗口。 方式二:单击【开始】菜单,依次指向【程序】→【MATLAB】即可启动并打开...
  • 反馈系数取值有相关要求,详见百度,作为参数传入时要以八进制表示。 半个载波周期的采样点数。 最小最大信噪比,以及其尝试步进。 最小最大载波振幅,以及其尝试步进。 !下载链接! 链接:...
  • Matlab绘图

    千次阅读 2018-05-27 10:36:24
    Matlab绘图 强大的绘图功能是Matlab的特点之一,Matlab提供了一系列的绘图函数,用户不需要过多的考虑绘图的细节,只需要给出一些基本参数就能得到所需图形,这类函数称为高层绘图函数。此外,Matlab还提供了直接对...
  • Matlab图像处理新手——图像分割和画框显示篇 **前言:**许多人说Matlab对未来的工作没什么用,就目前了解的情况而言并非如此。如:现版本已有matlab转化成C语音的功能;matlab与DSP(API协议技术)、FPGA、西门子...
  • 本期编辑 | 雯婷 微微本期校对 | 郭倩文章来源 | 材料基SCI图片绘画技巧众所周知,高水平的配图可以令论文、报告等显得耳目一新,瞬间提高一个档次。写文章、做报告,搞好配图已经...第10名:锯齿风MatlabMatlab只排...
  • 离散信号的Matlab表示

    千次阅读 2021-04-09 17:08:45
    例如序列x[k] = {2, 1, 1(⬇), -1, 3, 0, 2}可用Matlab表示为 k = -2 : 4; x= [2, 1, 1, -1, 3, 0, 2]; 若序列从0开始, 则只用一个向量x就可表示序列. 由于计算机内存的限制, Matlab无法表示一个无穷长的序列. ...
  • 目 录摘 要 1Abstract 11、 绪论 21.1 课题开发背景 21.1.1 图像融合的定义 21.1.2 手动配准与图象融合 21.1.3 图象融合研究的发展现状和研究热点 31.2 课题设计要求 42、MATLAB程序设计 52.1 MATLAB软件简介 52.2 ...
  • sawtooth(t)类似于sin(t),产生周期为2π,幅值从-1到+1的锯齿。在2π的 整数倍处,值为-1,从-1到+1这一段波形的斜率为1/π。
  • 编程生成典型周期信号(方波),自主改变信号幅值、频率及相位大小(画四个分图,2行2列) clear; close; clc t=-0.06:0.0001:0.06;%设置横坐标 y1=square(2*pi*50*t,75);%模板图 subplot(2,2,1)%2行2列的第一个图...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,846
精华内容 1,138
关键字:

matlab方波表示

matlab 订阅