閱讀786 返回首頁    go 微軟 go windows


科學音頻處理(二):如何使用 Octave 對音頻文件進行基本數學信號處理

信號疊加

兩個信號 S1(t)和 S2(t)相加形成一個新的信號 R(t),這個信號在任何瞬間的值等於構成它的兩個信號在那個時刻的值之和。就像下麵這樣:


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

我們將用 Octave 重新產生兩個信號的和並通過圖表看達到的效果。首先,我們生成兩個不同頻率的信號,看一看它們的疊加信號是什麼樣的。

第一步:產生兩個不同頻率的信號(oog 文件)


  1. >> sig1='cos440.ogg'; %creating the audio file @440 Hz
  2. >> sig2='cos880.ogg'; %creating the audio file @880 Hz
  3. >> fs=44100; %generating the parameters values (Period, sampling frequency and angular frequency)
  4. >> t=0:1/fs:0.02;
  5. >> w1=2*pi*440*t;
  6. >> w2=2*pi*880*t;
  7. >> audiowrite(sig1,cos(w1),fs); %writing the function cos(w) on the files created
  8. >> audiowrite(sig2,cos(w2),fs);

然後我們繪製出兩個信號的圖像。

信號 1 的圖像(440 赫茲)


  1. >> [y1, fs] = audioread(sig1);
  2. >> plot(y1)

信號 1 的圖像

信號 1 的圖像

信號 2 的圖像(880 赫茲)


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

信號 2 的圖像

信號 2 的圖像

第二步:把兩個信號疊加

現在我們展示一下前麵步驟中產生的兩個信號的和。


  1. >> sumres=y1+y2;
  2. >> plot(sumres)

疊加信號的圖像

和信號的圖像

和信號的圖像

Octaver 中的效果

在 Octaver 中,這個效果產生的聲音是獨特的,因為它可以仿真音樂家彈奏的低八度或者高八度音符(取決於內部程序設計),仿真音符和原始音符成對,也就是兩個音符發出相同的聲音。

第三步:把兩個真實的信號相加(比如兩首音樂歌曲)

為了實現這個目的,我們使用格列高利聖詠Gregorian Chants中的兩首歌曲(聲音采樣)。

聖母頌曲Avemaria Track

首先,我們看一下聖母頌曲並繪出它的圖像:


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

聖母歌曲

聖母歌曲

讚美詩曲Hymnus Track

現在我們看一下讚美詩曲並繪出它的圖像。


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

讚美詩曲

讚美詩曲

聖母頌曲 + 讚美詩曲


  1. >> y='avehymnus.ogg';
  2. >> audiowrite(y, y1+y2, fs);
  3. >> [y, fs]=audioread('avehymnus.ogg');
  4. >> plot(y)

聖母歌曲 + 讚美詩曲

聖母歌曲 + 讚美詩曲

結果,從音頻的角度來看,兩個聲音信號混合在了一起。

兩個信號的乘積

對於求兩個信號的乘積,我們可以使用類似求和的方法。我們使用之前生成的相同文件。


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

  1. >> sig1='cos440.ogg'; %creating the audio file @440 Hz
  2. >> sig2='cos880.ogg'; %creating the audio file @880 Hz
  3. >> product='prod.ogg'; %creating the audio file for product
  4. >> fs=44100; %generating the parameters values (Period, sampling frequency and angular frequency)
  5. >> t=0:1/fs:0.02;
  6. >> w1=2*pi*440*t;
  7. >> w2=2*pi*880*t;
  8. >> audiowrite(sig1, cos(w1), fs); %writing the function cos(w) on the files created
  9. >> audiowrite(sig2, cos(w2), fs);>> [y1,fs]=audioread(sig1);>> [y2,fs]=audioread(sig2);
  10. >> audiowrite(product, y1.*y2, fs); %performing the product
  11. >> [yprod,fs]=audioread(product);
  12. >> plot(yprod); %plotting the product

注意:我們必須使用操作符 ‘.*’,因為在參數文件中,這個乘積是值與值相乘。更多信息,請參考 Octave 矩陣操作產品手冊。

乘積生成信號的圖像

乘積信號的圖像

乘積信號的圖像

兩個基本頻率相差很大的信號相乘後的圖表效果(調製原理)

第一步:

生成兩個頻率為 220 赫茲的聲音信號。


  1. >> fs=44100;
  2. >> t=0:1/fs:0.03;
  3. >> w=2*pi*220*t;
  4. >> y1=cos(w);
  5. >> plot(y1);

載波

載波

第二步:

生成一個 22000 赫茲的高頻調製信號。


  1. >> y2=cos(100*w);
  2. >> plot(y2);

調製中

調製中

第三步:

把兩個信號相乘並繪出圖像。


  1. >> plot(y1.*y2);

調製後的信號

調製後的信號

一個信號和一個標量相乘

一個函數和一個標量相乘的效果等於更改它的值域,在某些情況下,更改的是相標誌。給定一個標量 K ,一個函數 F(t) 和這個標量相乘定義為:


  1. R(t) = K*F(t)

  1. >> [y,fs]=audioread('cos440.ogg'); %creating the work files
  2. >> res1='coslow.ogg';
  3. >> res2='coshigh.ogg';>> res3='cosinverted.ogg';
  4. >> K1=0.2; %values of the scalars
  5. >> K2=0.5;>> K3=-1;
  6. >> audiowrite(res1, K1*y, fs); %product function-scalar
  7. >> audiowrite(res2, K2*y, fs);
  8. >> audiowrite(res3, K3*y, fs);

原始信號的圖像


  1. >> plot(y)

信號振幅減為原始信號振幅的 0.2 倍後的圖像


  1. >> plot(res1)

低餘弦

低餘弦

信號振幅減為原始振幅的 0.5 倍後的圖像


  1. >> plot(res2)

高餘弦

高餘弦

倒相後的信號圖像


  1. >> plot(res3)

倒相餘弦

倒相餘弦

原文發布時間為:2016-09-30

本文來自雲棲社區合作夥伴“Linux中國”

最後更新:2017-06-06 16:02:57

  上一篇:go  在 Ubuntu 16.04 上安裝和使用服務器監控報警係統 Shinken
  下一篇:go  Instagram 基於 Python 語言的 Web Service 效率提升之道