科学音频处理(二):如何使用 Octave 对音频文件进行基本数学信号处理
创始人
2024-03-01 18:02:52
0

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

信号叠加

两个信号 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)

倒相余弦

结论

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


via: https://www.howtoforge.com/tutorial/octave-audio-signal-processing-ubuntu/

作者:David Duarte 译者:ucasFL 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

相关内容

开放通用智能,MiniMa...
8月3日,据MiniMax消息,MiniMax正式开源新一代通用视...
2026-08-03 20:02:14
小米开源可控视频音效生成模...
IT之家 5 月 29 日消息,小米大模型应用团队今日发布 Con...
2026-06-01 00:41:13
安克创新:首款AI音频芯片...
大河财立方5月24日消息,安克创新(300866.SZ)发布投资者...
2026-05-25 04:38:17
Vidda全新AI音频眼镜...
来源:环球网 【环球网科技综合报道】5月8日消息,海信&Vidd...
2026-05-09 10:34:00
小米开源OmniVoice...
据IT之家,小米AI实验室新一代Kaldi团队推出OmniVoic...
2026-05-07 23:26:23
Steam Deck OL...
IT之家 5 月 3 日消息,据科技媒体 Phoronix 昨天报...
2026-05-06 06:49:39

热门资讯

“Linux 中国” 开源社区... 这是一个艰难的决定 —— 这不是调侃,而是当你真正做出改变了你十几年生活轨迹的决定时,你就会明白这个...
硬核观察 #1263 德国铁路... #1 德国铁路公司招聘 Windows for Workgroups 3.11 管理员该职位要求了解...
人工智能教程(七):Sciki... 在本系列的 上一篇文章 中,我们用 TensorFlow 构建了第一个神经网络,然后还通过 Kera...
关闭 WSL 中正在运行的 L... 以下是使用 WSL 关闭在 Windows 内运行的 Linux 系统的不同方法。你使用 WSL 在...
MX Linux 23.2 “... 最新的 MX Linux 23.2 小版本更新带来了基本的改进和新增功能。MX Linux 推出了 ...
硬核观察 #1262 网络上最... #1 网络上最古老的软件存档库之一即将关闭美国新墨西哥州立大学(NMSU)最近宣布,即将于 2024...
如何在 RHEL 上通过绑定配... 在 Linux 中,你可以根据自己的需要创建高级网络设置,如 网络绑定 Network Bondin...
Linux Matrix 消息... Matrix 用户可以升级 Fractal 6 了!Fractal 是目前 最好的 Matrix 客...
如何通过 VLC 使用字幕 使用 VLC 媒体播放器播放和管理字幕的新手指南。我是一个超级动漫迷,如果你想观看最新的剧集,那么你...
硬核观察 #1261 X 计划... #1 X 计划在奥斯汀建立内容审核总部据报道,该部门将招聘 100 名全职员工,将主要关注 CSE ...