(2)オシロスコープと信号処理(信号処理編)

オシロスコープと信号処理 [信号処理編]
(最終改訂 2014/09/10)
本資料をベースにオシロスコープと信号処理の「信号処理」実験を進める。他の付属資料は必要に応
じて参考にすること。
ここで、信号処理の対象として音声信号を用いる。
実験の目的
音声信号を Matlab を使って処理することで、離散フーリエ変換と周波数領域での
フィルタリングについて理解する。
準備
イヤホン(ヘッドホンを含む)
:3.5φステレオプラグ付のものを用意すること。Matlab で再生される
音声を聴くために必須。
1. Matlab
のプログラミング
Matlab は、数値計算、可視化、プログラミングのための高水準言語および対話型環境のひとつで
あり、比較的に簡単に信号の入力・生成、分析、表示・出力等ができることから、今回 Matlab プ
ログラミングを使って音声信号を処理する。
実際に、音声信号を処理するプログラムを Matlab で作成するために下記の操作を行う。
1.Matlab を起動すると、既定のレイアウトでデスクトップが表示される(図 1)
。
図
1.
Matab の起動時の画面
2. 処理対象となるデータ・プログラム(filtertest.m)等を図1の左上の“現在のフォルダー”ウィ
ンドウにドラッグ&ドロップする。
3. 図1のメニューバーの“ホーム”の左から一番目の項目の“新規スクリプト”をダブルクリック
し、Matlab スクリプト(.m ファイル)を作成する。
#本資料の Matlab プログラムをここにコピ&ペーストが可能
4.Matlab スクリプトに適切な名前を付けて保存し、実行する。
重要
1. Matlab の基本的な使い方について慣れるため付属の getstart_ja_JP.pdf の一章の
「クイックスタート」を事前に学習しておくこと。
2. Matlab のコマンドの使い方について“Matlab コマンド名”キーワードを使ってインターネットで
検索することが可能。
2. 離散フーリエ変換を用いた周波数分析
離散フーリエ変換は代表的な周波数解析法の一つであり、現在のディジタル信号処理に欠かせない基
礎技術のひとつであるといえる。
フーリエ変換の定義
ある時系列データ x(n) (n=0,…,N-1)に対してその離散フーリエ変換と離散フーリエ逆変換が下記のよ
うに定義される1。
N 1
X ( k )   x ( n )e
j
2kn
N
n 0
1
x(n) 
N
N 1
 X ( k )e
k 0
j
N 1
  2kn 
 2kn  
  x ( n ) cos
  j sin

 N 
n 0
  N 
2kn
N
1

N
N 1

 2kn 
 2kn  
  j sin

N 
 N 
 X (k )cos
k 0
ここで、 X (k ) は周波数スペクトル(フーリエ係数)であり、| X (k ) |は振幅スペクトルという。
Matlab では関数 X = fft(x) (FFT: Fast Fourier Transform )と x = ifft(X) を用いて離散フーリエ
変換と離散フーリエ逆変換を行うこが可能である。ここで、
x と X はそれぞれ長さ N のベクトルである。
フーリエ変換の一つの使用法として、ノイズを含む時間領域の信号からその周波数成分を求める処理が
挙げられる。8192Hz でサンプリングされたデータがあるとする。70Hz、振幅 0.3 の正弦波と 150Hz、
振幅 0.7 の正弦波で信号(Signal 1)を構成し, 平均値がゼロのランダム ノイズ(Noise)を重ねる(図2)。
---------------------soundtest.m ----------------------1
実際、Matlab 上でベクトル又は行列のインデックスが1から始まることに注意が必要。
clear;close all
% Clear data, close figures
Fs = 8192;
% Sampling frequency
T = 1/Fs;
% Sample time
N = 5*Fs;
% length of the signal
t = (0:N-1)*T;
% time vector
(5 seconds)
% Sum of a 70 Hz sinusoid and a 150 Hz sinusoid
x = 0.3*sin(2*pi*70*t) + 0.7*sin(2*pi*150*t);
y = x + randn(size(t));
figure
% Sinusoids plus noise
% figure: original signal
plot(t(1:Fs*.1),x(1:Fs*.1)) % plot 0.1s long data
xlabel('time (s)')
title('Original Signal')
sound(x,Fs);
% play the sound
wavwrite(x,Fs,'70_150Hz.wav')% save sound to a file
pause(7)
% pause for 7 seconds
figure
% figure: corrupted signal
plot(t(1:Fs*.1),y(1:Fs*.1))
% plot 0.1s long data
title('Signal Corrupted with Zero-Mean Random Noise')
xlabel('time (s)')
sound(y, Fs);
% play the sound
wavwrite(y,Fs,'70_150HzAndNoise.wav')
図
% save sound to a file
2. 正弦波を重ね合わせた信号(Signal 1)とそれにランダムノイズを重ねた信号( Signal 1+Noise)
ノイズ追加信号を調べて周波数成分を識別することは困難である。周波数領域に変換するには、ノイズ
を含む信号 y の離散フーリエ係数 Y を高速フーリエ変換 (FFT) から求める(図 3)。
------------- ffttest.m -----------------------
Y = fft(y)/N;
% Fast Fourier Transform
f = Fs/2*linspace(0,1,N/2+1);
% Frequency axis vector: single side
A=2*abs(Y(1:N/2+1));
% Amplitude spectrum
% Plot single-sided amplitude spectrum.
figure
% Full data
plot(f,A)
title('Single-Sided Amplitude Spectrum of y(t)')
xlabel('Frequency (Hz)')
ylabel('|Y(f)|')
figure
% Part of the data
ShowFreq=200;
% show data up to *.Hz
plot(f(1:ShowFreq*N/Fs),A(1:ShowFreq*N/Fs))
title('Single-Sided Amplitude Spectrum of y(t)')
xlabel('Frequency (Hz)')
ylabel('|Y(f)|')
図
3. ランダムノイズを重ねた信号(Signal 1+Noise)の振幅スペクトル
ここで、振幅が正確に 0.3 や 0.7 にならない主な原因はノイズである。完全な振幅が得られないもう
1 つの理由は、有限長の信号を使用しているためである。
#本実験の各課題の結果グラフをレポートに貼り付けること。グラフを保存するにはメニューバーの
ファイル→名前を付けて保存→ファイルの種類で*.png 等を選択
課題
1.soundtest.m プログラムを実行し、ノイズ追加前の音声信号とノイズ追加後の音声信号を
比較してみよ。
課題
2. 元の音声信号(Signal 1)のサイン波の数、振幅、周波数等を変化させ(soundtest.m と
ffttest.m プログラムを実行し)、信号の振幅スペクトルを確認せよ。
3. 周波数領域で音声信号のフィルタリング
付属の Matlab プログラム filtertest.m は、
Matlab が生成するサイン波を重ね合わせた信号(Signal 1)
と Matlab で準備されている人の笑い声の音声信号;laughter(Signal 2)を重ねた信号を周波数領域
へ変換し、フィルタリングすることで、Signal 1 と Signal 2 を分離し、それぞれの元の信号を再現可
能であることを示すデモである。ここで、信号のフィルタリングに2つのフィルター;ローパスフィル
ター(LPF: Low Pass Filter)(低い周波数のみを通す。高周波数係数はゼロに設定)とハイパースフィ
ルター(HPF: High Pass Filter)(高い周波数をのみを通す。低周波数係数はゼロに設定)を使う。
Matlab プログラムが実行されると使用したいフィルターの種類とそのカットオフ周波数(周波数係数を
ゼロに設定する境目の周波数)をコマンドライン上で入力が可能となっている。
課題
3.フィルターの種類とカットオフ周波数を変化させて、音声信号を分離させよう。
それぞれの Signal 1 と Signal 2 を再現するために使用可能なフィルターの種類と
そのカットオフ周波数を定めよ。
#グラフの詳細を観察するためにはウィンドウを最大化し、メニューバーの
が選択された
状態で、拡大したい部分をダブルクリックする。
課題
4. Signal 2 の他に Matlab で用意されている下記の「ハレルヤ」音声信号を使って課題
3 の実験内容を実施せよ。必要に応じて各グラフのタイトルを変更すること。
例)
load handel;
%
handel のハレルヤ (Signal 3)
sound(y, Fs);
課題
5.(i)
時系列データ x(0)=0, x(1)=2, x(2)=3, x(3)=1 に対するフーリエ係数(X(0)~X(3))
を離散フーリエ変換の定義から筆算せよ。またその逆変換も定義より筆算せよ。
筆算プロセスをレポートに記載すること。
(ii) Matlab プログラミングにより(i)の結果を再現せよ。
時系列データ、全ての振幅スペクトル(今までの課題では、分かりやすさのために振幅ス
ペクトルの片側2しか表示してない)を表示する Matlab プログラム3を作成せよ。
Matlab プログラムとその結果グラフをレポートに貼り付けること。
2
3
実数値の離散フーリエ変換の振幅スペクトルは直流成分(| X (0) |,Matlab では A(1))を除いて、
左右対称となるので片側振幅スペクトルの表示だけで十分である。
fft の計算の際にフーリエ係数のスケーリング(÷N)は不要である。