オシロスコープと信号処理 [信号処理編] (最終改訂 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 2kn N n 0 1 x(n) N N 1 X ( k )e k 0 j N 1 2kn 2kn x ( n ) cos j sin N n 0 N 2kn N 1 N N 1 2kn 2kn 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)は不要である。
© Copyright 2024 ExpyDoc