David Duarte 发布的文章

我们的数字音频处理技术第三部分涵盖了信号调制内容,将解释如何进行 调幅 Amplitude Modulation 颤音效果 Tremolo Effect 频率变化 Frequency Variation

调制

调幅

正如它的名字暗示的那样, 影响正弦信号的振幅变化依据传递的信息而不断改变。正弦波因为承载着大量的信息被称作 载波 carrier 。这种调制技术被用于许多的商业广播和市民信息传输波段(AM)。

为何要使用调幅技术?

调制发射

假设信道是免费资源,有天线就可以发射和接收信号。这要求有效的电磁信号发射天线,它的大小和要被发射的信号的波长应该是同一数量级。很多信号,包括音频成分,通常在 100 赫兹或更低。对于这些信号,如果直接发射,我们就需要建立长达 300 公里的天线。如果通过信号调制将信息加载到 100MHz 的高频载波中,那么天线仅仅需要 1 米(横向长度)。

集中调制与多通道

假设多个信号占用一个通道,调制可以将不同的信号不同频域位置,以便接收者选择该特定信号。使用集中调制(“复用”)的应用有遥感探测数据、立体声调频收音机和长途电话等。

克服设备限制的调制

信号处理设备,比如过滤器、放大器,以及可以用它们简单组成的设备,它们的性能依赖于信号在频域中的境况以及高频率和低频信号的关系。调制可以用于传递信号到频域中的更容易满足设计需求的位置。调制也可以将“宽带信号“(高频和低频的比例很大的信号)转换成”窄带“信号。

音频特效

许多音频特效由于引人注目和处理信号的便捷性使用了调幅技术。我们可以说出很多,比如颤音、合唱、镶边等等。这种实用性就是我们关注它的原因。

颤音效果

颤音效果是调幅最简单的应用,为实现这样的效果,我们会用周期信号改变(乘)音频信号,使用正弦或其他。

>> tremolo='tremolo.ogg';
>> fs=44100;
>> t=0:1/fs:10;
>> wo=2*pi*440*t;
>> wa=2*pi*1.2*t;
>> audiowrite(tremolo, cos(wa).*cos(wo),fs);

Tremolo

这将创造一个正弦形状的信号,它的效果就像‘颤音’。

Tremolo Shape

在真实音频文件中的颤音

现在我们将展示真实世界中的颤音效果。首先,我们使用之前记录过男性发声 ‘A’ 的音频文件。这个信号图就像下面这样:

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

Vocal

现在我们将创建一个完整的正弦信号,使用如下的参数:

  • 增幅 = 1
  • 频率= 1.5Hz
  • 相位 = 0
>> t=0:1/fs:4.99999999;
>> t=t(:);
>> w=2*pi*1.5*t;
>> q=cos(w);
>> plot(q);

注意: 当我们创建一组时间值时,默认情况下,它是以列的格式呈现,如, 1x220500 的值。为了乘以这样的值,必须将其变成行的形式(220500x1)。这就是 t=t(:) 命令的作用。

Sinusodial

我们将创建第二份 ogg 音频格式的文件,它包含了如下的调制信号:

>> tremolo='tremolo.ogg';
>> audiowrite(tremolo, q.*y,fs);

Tremolo Signal

频率变化

我们可以改变频率实现一些有趣的音效,比如原音变形,电影音效,多人比赛。

正弦频率调制的影响

这是正弦调制频率变化的演示代码,根据方程:

Y=Ac*Cos(wo*Cos(wo/k))

这里:

  • Ac = 增幅
  • wo = 基频
  • k = 标量除数
>> fm='fm.ogg';
>> fs=44100;
>> t=0:1/fs:10;
>> w=2*pi*442*t;
>> audiowrite(fm, cos(cos(w/1500).*w), fs);
>> [y,fs]=audioread('fm.ogg');
>> figure (); plot (y);

信号图:

你可以使用几乎任何类型的周期函数频率调制。本例中,我们仅仅用了一个正弦函数。请大胆的改变函数频率,用复合函数,甚至改变函数的类型。


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

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

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

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

信号叠加

两个信号 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中国 荣誉推出

Octave 是一个 Linux 上类似于 Matlab 的软件,它拥有数量众多的函数和命令,支持声音采集、记录、回放以及音频信号的数字化处理,用于娱乐应用、研究、医学以及其它科学领域。在本教程中,我们会在 Ubuntu 上使用 Octave 的 4.0.0 版本读取音频文件,然后通过生成信号并且播放来模仿在各种情况下对音频信号的使用。

本教程中关注的不是安装和学习使用安装好的音频处理软件,而是从设计和音频工程的角度理解它是如何工作的。

环境准备

首先是安装 octave,在 Ubuntu 终端运行下面的命令添加 Octave PPA,然后安装 Octave 。

sudo apt-add-repository ppa:octave/stable
sudo apt-get update
sudo apt-get install octave

步骤1:打开 Octave

在这一步中我们单击软件图标打开 Octave,可以通过单击下拉式按钮选择工作路径。

步骤2:音频信息

使用audioinfo命令查看要处理的音频文件的相关信息。

>> info = audioinfo ('testing.ogg')

步骤3:读取音频文件

在本教程中我会使用 ogg 文件来读取这种文件的属性,比如采样、音频类型(stereo 和 mono)、信道数量等。必须声明的一点是教程中使用的所有的命令都是在 Octave 终端窗口中执行的。首先,我们必须要把这个 ogg 文件赋给一个变量。注意:文件必须在 Octave 的工作路径中。

>> file='yourfile.ogg'
>> [M, fs] = audioread(file)

这里的 M 是一个一列或两列的矩阵,取决于信道的数量,fs 是采样率。

下面的操作都可以读取音频文件:

>> [y, fs] = audioread (filename, samples)

>> [y, fs] = audioread (filename, datatype)

>> [y, fs] = audioread (filename, samples, datatype)

samples 指定开始帧和结束帧,datatype 指定返回的数据类型。可以为所有变量设置值:

>> samples = [1, fs)

>> [y, fs] = audioread (filename, samples)

数据类型:

>> [y,Fs] = audioread(filename,'native')

如果值是“native”,那么它的数据类型就依数据在音频文件中的存储情况而定。

步骤4:音频文件的写操作

新建一个 ogg 文件:

我们会从一个余弦值创建一个 ogg 文件。采样率是每秒 44100 次,这个文件最少进行 10 秒的采样。余弦信号的频率是 440 Hz。

>> filename='cosine.ogg';
>> fs=44100;
>> t=0:1/fs:10;
>> w=2*pi*440*t;
>> signal=cos(w);
>> audiowrite(filename, signal, fs);

这就在工作路径中创建了一个 'cosine.ogg' 文件,这个文件中包含余弦信号。

播放这个 'cosine.ogg' 文件就会产生一个 440Hz 的 音调,这个音调正好是乐理中的 'A' 调。如果需要查看保存在文件中的值就必须使用 'audioread' 函数读取文件。在后续的教程中,我们会看到怎样在两个信道中读取一个音频文件。

步骤5:播放音频文件

Octave 有一个默认的音频播放器,可以用这个音频播放器进行测试。使用下面的函数:

>> [y,fs]=audioread('yourfile.ogg');
>> player=audioplayer(y, fs, 8)

  scalar structure containing the fields:

    BitsPerSample =  8
    CurrentSample = 0
    DeviceID = -1
    NumberOfChannels =  1
    Running = off
    SampleRate =  44100
    TotalSamples =  236473
    Tag =
    Type = audioplayer
    UserData = [](0x0)
>> play(player);

在这个教程的续篇,我们会进入音频处理的高级特性部分,可能会接触到一些科学和商业应用中的实例。


via: https://www.howtoforge.com/tutorial/how-to-read-and-write-audio-files-with-octave-4-in-ubuntu/

作者:David Duarte 译者:vim-kakali 校对:wxy

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