继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

科学音频处理(二):如何使用 Octave 对音频文件进行基本数学信号处理

慕码人8056858
关注TA
已关注
手记 1238
粉丝 350
获赞 1323

在前一篇的指导教程中我们看到了读、写以及重放音频文件的简单步骤我们甚至看到如何从一个周期函数比如余弦函数合成一个音频文件。在这篇指导教程中我们将会看到如何对信号进行叠加和倍乘调整并应用一些基本的数学函数看看它们对原始信号的影响。


信号叠加

两个信号 S1t和 S2t相加形成一个新的信号 R(t)这个信号在任何瞬间的值等于构成它的两个信号在那个时刻的值之和。就像下面这样


R(t) = S1(t) + S2(t)

我们将用 Octave 重新产生两个信号的和并通过图表看达到的效果。首先我们生成两个不同频率的信号看一看它们的叠加信号是什么样的。


第一步产生两个不同频率的信号oog 文件

>> sig1='cos440.ogg';                  %creating the audio file @440 Hz

>> sig2='cos880.ogg';                  %creating the audio file @880 Hz

>> fs=44100;                           %generating the parameters values (Period, sampling frequency and angular frequency)

>> t=0:1/fs:0.02;

>> w1=2*pi*440*t;

>> w2=2*pi*880*t;

>> audiowrite(sig1,cos(w1),fs);        %writing the function cos(w) on the files created

>> audiowrite(sig2,cos(w2),fs);

然后我们绘制出两个信号的图像。

信号 1 的图像440 赫兹


>> [y1, fs] = audioread(sig1);

>> plot(y1)

ä¿¡å· 1 çå¾å

信号 1 的图像


信号 2 的图像880 赫兹


>> [y2, fs] = audioread(sig2);

>> plot(y2)

ä¿¡å· 2 çå¾å


信号 2 的图像


第二步把两个信号叠加

现在我们展示一下前面步骤中产生的两个信号的和。


>> sumres=y1+y2;

>> plot(sumres)

叠加信号的图像


åä¿¡å·çå¾å


和信号的图像


Octaver 中的效果


在 Octaver 中这个效果产生的声音是独特的因为它可以仿真音乐家弹奏的低八度或者高八度音符取决于内部程序设计仿真音符和原始音符成对也就是两个音符发出相同的声音。


第三步把两个真实的信号相加比如两首音乐歌曲

为了实现这个目的我们使用格列高利圣咏Gregorian Chants中的两首歌曲声音采样。


圣母颂曲Avemaria Track


首先我们看一下圣母颂曲并绘出它的图像


>> [y1,fs]=audioread('avemaria_.ogg');

>> plot(y1)

å£æ¯æ­æ²


圣母歌曲


赞美诗曲Hymnus Track


现在我们看一下赞美诗曲并绘出它的图像。


>> [y2,fs]=audioread('hymnus.ogg');

>> plot(y2)

èµç¾è¯æ²


赞美诗曲


圣母颂曲 + 赞美诗曲


>> y='avehymnus.ogg';

>> audiowrite(y, y1+y2, fs);

>> [y, fs]=audioread('avehymnus.ogg');

>> plot(y)

å£æ¯æ­æ² + èµç¾è¯æ²


圣母歌曲 + 赞美诗曲


结果从音频的角度来看两个声音信号混合在了一起。


两个信号的乘积

对于求两个信号的乘积我们可以使用类似求和的方法。我们使用之前生成的相同文件。


R(t) = S1(t) * S2(t)

>> sig1='cos440.ogg';                  %creating the audio file @440 Hz

>> sig2='cos880.ogg';                  %creating the audio file @880 Hz

>> product='prod.ogg';                 %creating the audio file for product

>> fs=44100;                           %generating the parameters values (Period, sampling frequency and angular frequency)

>> t=0:1/fs:0.02;

>> w1=2*pi*440*t;

>> w2=2*pi*880*t;

>> audiowrite(sig1, cos(w1), fs);      %writing the function cos(w) on the files created

>> audiowrite(sig2, cos(w2), fs);>> [y1,fs]=audioread(sig1);>> [y2,fs]=audioread(sig2);

>> audiowrite(product, y1.*y2, fs);    %performing the product

>> [yprod,fs]=audioread(product);

>> plot(yprod);                        %plotting the product

注意我们必须使用操作符 ‘.*’因为在参数文件中这个乘积是值与值相乘。更多信息请参考 Octave 矩阵操作产品手册。


乘积生成信号的图像

ä¹ç§¯ä¿¡å·çå¾å


乘积信号的图像


两个基本频率相差很大的信号相乘后的图表效果调制原理

第一步


生成两个频率为 220 赫兹的声音信号。


>> fs=44100;

>> t=0:1/fs:0.03;

>> w=2*pi*220*t;

>> y1=cos(w);

>> plot(y1);

载波


载波


第二步


生成一个 22000 赫兹的高频调制信号。


>> y2=cos(100*w);

>> plot(y2);

è°å¶ä¸­

调制中


第三步


把两个信号相乘并绘出图像。


>> plot(y1.*y2);

è°å¶åçä¿¡å·


调制后的信号


一个信号和一个标量相乘

一个函数和一个标量相乘的效果等于更改它的值域在某些情况下更改的是相标志。给定一个标量 K 一个函数 F(t) 和这个标量相乘定义为


R(t) = K*F(t)

>> [y,fs]=audioread('cos440.ogg');        %creating the work files

>> res1='coslow.ogg';                

>> res2='coshigh.ogg';>> res3='cosinverted.ogg';

>> K1=0.2;                                %values of the scalars

>> K2=0.5;>> K3=-1;

>> audiowrite(res1, K1*y, fs);            %product function-scalar

>> audiowrite(res2, K2*y, fs);

>> audiowrite(res3, K3*y, fs);

原始信号的图像

5bae5ba100017c0e05500291.jpg

>> plot(y)



信号振幅减为原始信号振幅的 0.2 倍后的图像


>> plot(res1)

ä½ä½å¼¦


低余弦


信号振幅减为原始振幅的 0.5 倍后的图像


>> plot(res2)

é«ä½å¼¦


高余弦


倒相后的信号图像


>> plot(res3)

åç¸ä½å¼¦


倒相余弦


结论

基本数学运算比如代数和、乘以及函数与常量相乘是更多高级运算比如谱分析、振幅调制角调制等的支柱和基础。在下一个教程中我们来看一看如何进行这样的运算以及它们对声音文件产生的效果。

编译自https://www.howtoforge.com/tutorial/octave-audio-signal-processing-ubuntu/作者 David Duarte
原创LCTT https://linux.cn/article-7824-1.html译者 Lv Feng

打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP