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

    xiaoxiao2024-01-01  158

    信号叠加

    两个信号 S1(t)和 S2(t)相加形成一个新的信号 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 的图像

    信号 2 的图像(880 赫兹)

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

    信号 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);

    原始信号的图像

    >> plot(y)

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

    >> plot(res1)

    低余弦

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

    >> plot(res2)

    高余弦

    倒相后的信号图像

    >> plot(res3)

    倒相余弦

    原文发布时间为:2016-09-30

    本文来自云栖社区合作伙伴“Linux中国”

    相关资源:敏捷开发V1.0.pptx
    最新回复(0)