オシロスコープと信号処理 信号処理編 テキストct13050/johogaku/2-2.signal...4...

28
1 オシロスコープと信号処理 [信号処理編]テキスト (最終改訂 2016/04/27実験の目的 音響機器を例に取ると、聴感上殆ど品位を損なうことなくデータ量を削減する、音程を変えず再生速 度だけを変える、コンサートホールで実際に演奏したものと同じ残響を付加する、等の複雑な処理を実 時間で行うことができる。これらは時間領域の情報(波形)を周波数領域の情報(スペクトル)に変換 して処理し逆変換で時間領域に戻すもので、離散フーリエ変換を高速に行う FFT アルゴリズム(参考 文献参照)なくしては不可能であった。本課題では数値計算言語 MATLAB を用いて音声信号の周波数 領域での簡単な、しかしアナログ回路では不可能な急峻な特性のフィルタ処理を行い、離散フーリエ変 換と周波数領域で処理することの意味について理解する。 参考文献 大浦拓哉、FFT (高速フーリエ・コサイン・サイン変換) の概略と設計法 http://www.kurims.kyoto-u.ac.jp/~ooura/fftman/ 注意 本テキストでは実験を行う上で必要な項目について記述しており、信号処理の詳細についてはディジ タル信号処理の教科書に譲る。情報学実験Ⅱ課題②「オシロスコープと信号処理」(以下「課題Ⅱ②」 と言い、他の課題についても同様に表記する。)は、オシロスコープ編と信号処理編と併せて 1 課題と しており、信号処理編の作業は 2 コマ目2016 年度は 2015 年度と同様、コンピュータ科学科では 2 限、情報デザイン学科では 4 限)に行う。オシロスコープ編では Local PC(ローカル PC)でログイン したが、信号処理編ではオシロスコープ編の事前準備と同様に MATLAB のインストールされている Virtual Desktop (仮想デスクトップ)でログインする。オシロスコープ編以外にも PC のサウンドカー ドを用いる課題Ⅰ②、課題Ⅰ⑦、課題Ⅱ④では Local PC での作業を要するが、 MATLAB 既定の標本化 周波数(8192Hz)による本編の作業では再生周波数が 4096Hz 未満であるため、Virtual Desktop のサ ウンド機能で支障はない。 10 7 日の再実験日には「信号処理編」のみを行う。レポートで「オシロスコープ編」の報告に相 当する代替項目についてはオシロスコープ編テキスト末尾の備考 p. 22「レポート作成について」を参 照のこと。 参考資料 MATLAB 入門 http://jp.mathworks.com/help/pdf_doc/matlab/getstart_ja_JP.pdf MATLAB 数学 http://jp.mathworks.com/help/pdf_doc/matlab/math_ja_JP.pdf MATLAB プログラミングの基礎 http://jp.mathworks.com/help/pdf_doc/matlab/matlab_prog_ja_JP.pdf MATLAB 関数リファレンス http://jp.mathworks.com/help/pdf_doc/matlab/matlab_refbook_ja_JP.pdf 実験ノート以外に用意するもの イヤホン(JIS 用語でヘッドホンを含む):3.5φステレオプラグ付のもので 70Hz の正弦波を良好に

Upload: vutuyen

Post on 25-Mar-2018

267 views

Category:

Documents


8 download

TRANSCRIPT

Page 1: オシロスコープと信号処理 信号処理編 テキストct13050/johogaku/2-2.signal...4 MATLAB 関数fftは正規化係数を1 としており、fftの結果から振幅を求めるには標本数N

1

オシロスコープと信号処理 [信号処理編]テキスト

(最終改訂 2016/04/27)

実験の目的

音響機器を例に取ると、聴感上殆ど品位を損なうことなくデータ量を削減する、音程を変えず再生速

度だけを変える、コンサートホールで実際に演奏したものと同じ残響を付加する、等の複雑な処理を実

時間で行うことができる。これらは時間領域の情報(波形)を周波数領域の情報(スペクトル)に変換

して処理し逆変換で時間領域に戻すもので、離散フーリエ変換を高速に行う FFT アルゴリズム(参考

文献参照)なくしては不可能であった。本課題では数値計算言語 MATLAB を用いて音声信号の周波数

領域での簡単な、しかしアナログ回路では不可能な急峻な特性のフィルタ処理を行い、離散フーリエ変

換と周波数領域で処理することの意味について理解する。

参考文献

大浦拓哉、FFT (高速フーリエ・コサイン・サイン変換) の概略と設計法

http://www.kurims.kyoto-u.ac.jp/~ooura/fftman/

注意

本テキストでは実験を行う上で必要な項目について記述しており、信号処理の詳細についてはディジ

タル信号処理の教科書に譲る。情報学実験Ⅱ課題②「オシロスコープと信号処理」(以下「課題Ⅱ②」

と言い、他の課題についても同様に表記する。)は、オシロスコープ編と信号処理編と併せて 1 課題と

しており、信号処理編の作業は 2 コマ目(2016 年度は 2015 年度と同様、コンピュータ科学科では 2

限、情報デザイン学科では 4 限)に行う。オシロスコープ編では Local PC(ローカル PC)でログイン

したが、信号処理編ではオシロスコープ編の事前準備と同様に MATLAB のインストールされている

Virtual Desktop(仮想デスクトップ)でログインする。オシロスコープ編以外にも PC のサウンドカー

ドを用いる課題Ⅰ②、課題Ⅰ⑦、課題Ⅱ④では Local PC での作業を要するが、MATLAB 既定の標本化

周波数(8192Hz)による本編の作業では再生周波数が 4096Hz 未満であるため、Virtual Desktop のサ

ウンド機能で支障はない。

10 月 7 日の再実験日には「信号処理編」のみを行う。レポートで「オシロスコープ編」の報告に相

当する代替項目についてはオシロスコープ編テキスト末尾の備考 p. 22「レポート作成について」を参

照のこと。

参考資料

MATLAB 入門

http://jp.mathworks.com/help/pdf_doc/matlab/getstart_ja_JP.pdf

MATLAB 数学

http://jp.mathworks.com/help/pdf_doc/matlab/math_ja_JP.pdf

MATLAB プログラミングの基礎

http://jp.mathworks.com/help/pdf_doc/matlab/matlab_prog_ja_JP.pdf

MATLAB 関数リファレンス

http://jp.mathworks.com/help/pdf_doc/matlab/matlab_refbook_ja_JP.pdf

実験ノート以外に用意するもの

イヤホン(JIS 用語でヘッドホンを含む):3.5φステレオプラグ付のもので 70Hz の正弦波を良好に

Page 2: オシロスコープと信号処理 信号処理編 テキストct13050/johogaku/2-2.signal...4 MATLAB 関数fftは正規化係数を1 としており、fftの結果から振幅を求めるには標本数N

2

再生できるものであること。MATLAB で再生される音声を聴くために必須。

USB メモリ:音声ファイル、キャプチャ画像ファイル、MATLAB スクリプトの保存用

事前準備

情報学実験のページから MATLAB_sample.zip をダウンロードして解凍し、MATLAB の「現在のフ

ォルダー」に置いておくこと。必ず、本テキストに最後まで目を通して、本課題で必要なデータの意味

を理解し、全体の作業の流れを把握しておく。p. 1 参考資料に掲げた MATLAB 参考資料に関しては、

必要なときに適切に参照できる様、最低限「MATLAB 入門」の目次だけには目を通しておく。本課題

の作業では準備課題である課題Ⅰ⑦の理解が前提となっており、課題Ⅰ⑦で表紙の交付を受けられなか

った学生は十分に復習をしておくこと。

使用機器・部品類

報科学研究教育センターPC:Virtual Desktop(仮想デスクトップ)でログインすることに注意。

使用ソフトウェア

MATLAB

表紙交付基準

以下の事項の全ての完成を確認して表紙を交付する。レポート作成については、実験手順中の記述の

他、本テキスト末尾の備考 p. 17「レポート作成について」を参照のこと。

● 1節の作業の Y(k,:)の値【実験ノートで確認する】

● 2節の作業の正弦波の振幅、周波数、max(y)、min(y)の値【実験ノートで確認する】

● 3節の作業の f c の値【実験ノートで確認する】

● 3節の作業の plotspec(u);⏎でプロットした振幅スペクトルのキャプチャ画像【この項目のみ PC

のディスプレイに表示して確認する】

● 1~3節の作業において、audiowrite で保存した全ての音声ファイルのファイル名(拡張子を含

む)とファイルサイズ(プロパティで表示されたバイト単位の値)の記録【実験ノートで確認する】

離散フーリエ変換について

課題Ⅰ⑦では周期関数(時間の関数とする)がフーリエ級数展開により定数項(直流成分)、基本波

(周波数が元の関数の基本周期の逆数)とその高調波で合成される(実際の展開の係数は積分で求めら

れるが課題Ⅰ⑦では割愛した)ことを三角波と矩形波の合成で確認した。ここでは関数は時間領域では

連続であるが、周波数領域では離散的(展開の係数は基本波の整数倍の周波数に対するもののみ。ただ

し個数は可付番無限)である。周期を無限大に拡張してフーリエ級数の和を積分に置き換えたフーリエ

変換では時間領域、周波数領域の両方で連続となる。一方、フーリエ級数展開で展開される関数を標本

化した離散量とし、展開を標本点のみで一致させることを考えると、級数展開は有限項でよく時間領域

と周波数領域の何れにおいても離散有限個のデータで表されたことになる。

標本化周波数 Fs [Hz]による N 個の標本(信号長 Td=N /Fs [s])が与えられたとき、これが周期 Td

で無限に繰返す信号であると考えると、フーリエ級数展開と同様に周波数 1/Td = Fs /N の基本波とその

高調波で表される。ここで標本化定理により復元可能な周波数が Nyquist 周波数(Fs /2)未満(「以下」

ではない。p. 3 下註、p. 7「Nyquist 周波数の信号」後述)であることから、標本点のみで一致させる

には有限項でよいことが分る。実際に複素フーリエ級数で考えると N 個の係数で十分であり、これが離

Page 3: オシロスコープと信号処理 信号処理編 テキストct13050/johogaku/2-2.signal...4 MATLAB 関数fftは正規化係数を1 としており、fftの結果から振幅を求めるには標本数N

3

散フーリエ変換の式に当り、ある時系列データ x(n) (n = 0,…,N -1)から周波数スペクトル(フーリエ

係数)X(k) (k = 0,…,N -1)への変換とその逆変換はそれぞれ次の式で与えられる(註参照)。

1

0

1

0

2i

1

0

1

0

2i

2sin i

2cos)(

1e )(

1)(

2sin i

2cos)(e )()(

N

k

N

k

N

kn

N

n

N

n

N

kn

N

kn

N

knkX

NkX

Nnx

N

kn

N

knnxnxkX

  

    

註:この式では正規化係数を変換で 1、逆変換で 1/N として標本数で割る操作を逆変換で行うが、教科

書、公式集により異なり、ソフトウェアでも違いがあるため、混合して利用する場合にはそれぞれで定

義された内容を確認する必要がある。MATLAB は上式の定義を採用しているが、数式処理システム

Mathematica では変換、逆変換で共に標本数の平方根で割る対称な形になっており(ユニタリ変換と

なる)、指数関数の引数の符号も Mathematica と MATLAB とでは逆である。なお、Mathematica と

同様な数式処理ソフトウェアである Maple では MATLAB と同じ定義を採用している。

MATLAB では、離散フーリエ変換とその逆変換が高速フーリエ変換(fast Fourier transform:FFT

と略される)アルゴリズムで実装されており、関数名はそれぞれ fft、ifftである。MATLAB の標準

では(以下では、MATLAB での実行に即し変数を斜体ではなく立体で表記する)、標本数 N、チャンネ

ル数 n の音声データを N×n の行列(モノラルならば列ベクトル、ステレオの場合、1 列目が左、2 列

目が右のデータ)で表す。y を標本化周波数 Fs の N×2 の行列で表された音声データ(実数値)とする

とき、Y=fft(y)の結果 Y もまた N×2 の行列となる。Y の各要素は周波数が Fs/N(これがスペクトル

の周波数分解能になる)の整数倍(0 倍の直流および負の周波数を含む)の成分で 1 行目が直流成分を

示す実数、k 行目(N が偶数のとき 2≦k≦N/2、奇数のとき 2≦k≦(N+1)/2 )が周波数 (k-1) Fs/N、

m 行目(N が偶数のとき N/2+2≦m≦N、奇数のとき(N+3)/2≦m≦N)が周波数 (m-N-1) Fs/N の成

分をそれぞれ表す。

Y の k 行目と N+2-k 行目の内容は複素共役で(isreal(circshift(Y,-1)+flipud(Y))が真値

の 1 を返すことでこれを確認できる。註参照)、前半部分だけで振幅と位相の情報を全て含んでおり、

実数値の信号では実用上負の周波数を用いる必要はない。MATLAB の ifft は、最初に引数の複素共

役の確認を行い、共役である場合は結果が実数であることを利用して高速化している。実数の fft結果

を ifftで返した変数の型をワークスペースで確認すると complex doubleではなく doubleと表示

されるが、演算精度が驚異的なのではなくその様に仮定した結果である。

註:すなわち N が偶数のとき N/2+1 行目も実数になる。この要素は Nyquist 周波数 Fs/2 に対応する(N

が奇数の場合、対応する周波数は全て絶対値が Nyquist 周波数未満である)が振幅と位相の情報を表す

ことができない。

以下の内容は、実際にコマンドとして入力して確認することを推奨する(「⏎」は Enter キーを示す)。

入力の便宜のため(sin、cos の引数に毎回 2*pi*を入力する手間を省くため)、ここでは最初に時間

ベクトルの 2π倍(単位周波数に対する位相ベクトルに相当)を生成する。

● 振幅情報

離散フーリエ変換の結果(フーリエ係数)は各周波数成分の振幅と位相の情報を示しているが、

Page 4: オシロスコープと信号処理 信号処理編 テキストct13050/johogaku/2-2.signal...4 MATLAB 関数fftは正規化係数を1 としており、fftの結果から振幅を求めるには標本数N

4

MATLAB 関数 fftは正規化係数を 1 としており、fftの結果から振幅を求めるには標本数 N で割る必

要がある(MATLAB_sample.zip の plotspec.m は引数の音声信号を y、標本数を N とするとき、

fft(y)ではなく fft(y)/N を返す仕様としている)。フーリエ係数の絶対値の自乗が各周波数成分の

パワーを表すことから各周波数成分の正弦波の振幅を非負の周波数要素で表す場合、周波数に対応する

要素が 1 個である実数の要素では第 1 行(直流成分のオフセット値に該当)が絶対値そのまま、N が偶

数の場合の N/2+1 行(Nyquist 周波数に対応)が絶対値の√2 倍(同じパワーの矩形波と正弦波では振

幅が√2 倍異なる)、複素共役な対を持つ要素では絶対値の 2 倍(同じパワーの矩形波と正弦波では振幅

が√2 倍異なることに加え、正と負の周波数要素があることで実際のパワーは正負の一方が表すものの

2 倍で振幅は√2 倍となり、√2×√2 で 2 倍)である。

信号に含まれる正弦波の周波数(Nyquist 周波数未満)が周波数分解能 Fs/N の整数倍ではない場合、

この周波数に対応する要素が無いため、振幅の情報は当該周波数付近(減衰はするがスロープは広く、

直流成分も現れる)の要素に拡散し振幅スペクトルのプロット(各要素の値を折線でつないだもの)か

らは正弦波の振幅を読取れない。

例として標本化周波数8192Hzで5秒間(周波数分解能0.2Hz)の正弦波信号で左チャンネルを50.5Hz

(対応する要素は 253.5 が非整数のため存在しない)に、右チャンネルを 70Hz(対応する要素は 351

行)でそれぞれ振幅 1 の正弦波を生成してこのことを確認する。

format compact⏎ 【結果表示に空行を入れない】

Fs=8192; Td=5; N=Fs*Td;⏎ 【標本化周波数(Hz)、信号長(s)、標本数を設定】

p=2*pi*(0:N-1)/Fs;⏎ 【位相ベクトルを定義:セミコロンを忘れないこと(以下同様)】

x1=sin(50.5*p);⏎ 【振幅 1、周波数 50.5Hz の正弦波】

x2=-sin(70*p);⏎ 【振幅 1、周波数 70Hz、負極性の正弦波】

y=[x1' x2'];⏎ 【転置して連結する】

plotwave(y,Fs,[0 0.05]);⏎ 【0~0.05秒の区間の波形を表示する(図 1左端)】

Y=plotspec(y,Fs,[0 200]);⏎ 【0Hz~200Hz のスペクトルを表示する(図 1中右に抜粋)】

図 1 周波数分解能の整数倍と非整数倍の周波数の正弦波の表示スペクトルの違い

format long;⏎ 【表示精度を倍精度とする】

Y(351,:)⏎ 【70Hz に該当するフーリエ係数を表示する。値を表示するのでセミコロンはつけない】

ans =

-0.001368358440493 + 0.000000000000000i 0.000000000000021 +

0.500000000000000i 【右チャンネルの値(振幅 1負極性の正弦波)は絶対値 0.5、偏角π/2】

angle(Y(351,:))⏎ 【実際に偏角を表示する】

Page 5: オシロスコープと信号処理 信号処理編 テキストct13050/johogaku/2-2.signal...4 MATLAB 関数fftは正規化係数を1 としており、fftの結果から振幅を求めるには標本数N

5

ans =

3.141592653589763 1.570796326794854 【負極性の sinの位相はπ/2】

A=abs(Y);⏎ 【振幅を得るためフーリエ係数の絶対値を求める】

A(2:20480,:)=A(2:20480,:)*2;⏎ 【正弦波の振幅になる様、正の周波数部分を 2倍する】

A(351,:)⏎ 【70Hz に該当する要素を表示する】

ans =

0.002736716880987 1.000000000000000 【右チャンネルの振幅 1が正しく表示される】

A(250:257,:)⏎ 【50.5Hz に該当するインデックス 253.5 の要素は無いので前後を表示する】

ans =

0.091580082151327 0.000000000000000

0.127957091742188 0.000000000000000

0.212838469959350 0.000000000000000

0.637250398426736 0.000000000000000 【インデックス 253 で最大となるが 1/√2 より

かなり小さい】

0.635990394461533 0.000000000000000 【インデックス 254 でもほぼ同じ値】

0.211578456107723 0.000000000000000

0.126697058117208 0.000000000000000

0.090320018865149 0.000000000000000

sum(A(250:257,:).^2)⏎ 【前後の各成分の自乗和を求める】

ans =

0.949607288643254 0.000000000000000 【1にはかなり不足する】

s0=A(1,:).^2*2⏎ 【直流成分のパワー(正の周波数成分 A(2:20480,:)がパワーとして

4倍されていることへの対応)】

s0 =

1.0e-05 *

0.317759749467807 0.000000000000000 【ここまでスロープが伸びている】

s1=sum(A(2:20480,:).^2) ⏎ 【正の周波数成分の自乗和を求めると...】

s1 =

0.999996822402057 1.000000000000000 【これだけでは 1に不足する】

s2=A(20481,:).^2*2⏎ 【Nyquist周波数成分のパワー(これも*2が必要)】

s2 =

1.0e-12 *

0.447220100658460 0.000000000000000 【演算精度からは無視できない量】

s=s0+s1+s2⏎ 【全ての和を取ると...】

s =

0.999999999999999 1.000000000000000 【演算精度の範囲で 1に等しくなる】

sum(y(1:end,:).^2)/N⏎ 【時間領域のパワーと】

ans =

0.499999999999999 0.499999999999998

sum(abs(Y(1:end,:)).^2)⏎ 【周波数領域のパワーとは】

ans =

0.500000000000001 0.500000000000000 【等しい(Parsevalの定理)】

d=abs(ifft(Y*N)-y);⏎ 【変換して逆変換したものと元の信号との差を取り】

max(d)⏎ 【その最大値を表示すると】

Page 6: オシロスコープと信号処理 信号処理編 テキストct13050/johogaku/2-2.signal...4 MATLAB 関数fftは正規化係数を1 としており、fftの結果から振幅を求めるには標本数N

6

ans =

1.0e-14 *

0.122124532708767 0.111022302462516 【十分な演算精度のあることが分る】

rms(d)⏎ 【また根自乗平均誤差は】

ans =

1.0e-15 *

0.305196522672526 0.265332238618231 【最大誤差の 1/4程度である】

図 2 WaveSpectra による分析表示(左 2 個は Hanning 窓、右 2 個は窓関数無し)

図2は、上記の音声信号yに1-2-15の係数を掛けて音声信号の絶対値最大が音声ファイル上の0dBFS

標本となる様に調整した上で音声ファイルとして保存したものをWaveSpectraで分析区間を4096点と

して分析したものを示す。p.4 図 1 中の 50.5Hz の振幅表示と異なり、WaveSpectra のスペクトルウィ

ンドウでは窓関数無し(矩形窓)の場合にも 50.5Hz(THD+N は 5%近い大きな値となるが)の本来の

振幅が 70Hz の振幅と同様に正確に表示されている。これは振幅計算のアルゴリズムの違いである。

● 位相情報

周波数領域の情報には振幅情報(PicoScope 6、WaveSpectra などで通常「スペクトル」として示さ

れるもの)の他に位相情報があり、この情報が無ければ時間領域に戻すことはできない。フーリエ係数

の非負の周波数要素を用いる場合、要素の偏角(MATLAB の関数名は arg ではなく angle であるこ

とに注意する)は正極性の cos(周波数 0 である正の直流成分を含む)を基準とした位相を表しており、

例えば sin(x)=cos(x-π/2)から±sinの位相は∓π/2となる。

以下の例では波形表示の plotwaveでは、0~0.05 秒の波形を表示し、スペクトル表示の plotspec

のオプションでは、周波数範囲を 0Hz~200Hz、位相スペクトルをπで割って表示し振幅閾値を 10-2、

振幅スペクトルの対数軸レンジを 3 桁、グリッド表示としている(p. 7 図 3 では対数軸表示の Figure

を割愛している)。

u1=sin(50*p-pi/3);⏎ 【振幅 1、周波数 50Hz、位相 -5π/6】

u2=cos(100*p+pi/3);⏎ 【振幅 1、周波数 100Hz、位相 π/3】

v=[u1' u2'];⏎ 【転置して連結する】

plotwave(v,Fs,[0 0.05]);⏎ 【0~0.05秒の区間の波形を表示する(p. 7 図 3左端)】

V=plotspec(v,Fs,[0 200 -10^-2 -3]);⏎ 【0Hz~200Hzのスペクトルを表示する(図 3中右に

抜粋)】

Page 7: オシロスコープと信号処理 信号処理編 テキストct13050/johogaku/2-2.signal...4 MATLAB 関数fftは正規化係数を1 としており、fftの結果から振幅を求めるには標本数N

7

図 3 正弦波の波形、振幅スペクトル、位相スペクトル

● Nyquist 周波数の信号

標本数 N が偶数の場合、フーリエ係数の N/2+1 番目の要素は(順序だけを考えれば)Nyquist 周波

数に対応するが、対となる複素共役な要素が無い(註参照)。0 でない周波数に対し振幅位相情報は正負

の周波数要素が対で担うものであり、実数値となる N/2+1 番目の要素は位相情報を持てず、振幅を正し

く表せるのは±cos のみである。

註:極性反転ができないためディジタルオーディオでは使えない 2の補数表現の (100…0)2に似ており、

N/2+1 番目の要素は Fs/2 ではなく-Fs/2 に対応していると見た方が分りやすい。

r1=sin(4096*p);⏎ 【振幅 1、周波数 4096Hz、位相 -π/2】

r2=-cos(4096*p);⏎ 【振幅 1、周波数 4096Hz、位相 ±π】

s=[r1' r2'];⏎ 【転置して連結する】

plotwave(s,Fs,[0 0.001]);⏎ 【0~0.001秒の区間の波形を表示する(図 4左端)】

S=plotspec(s);⏎ 【スペクトルを既定オプションで表示する(図 4中右に抜粋)】

S(20481,:)⏎ 【周波数 Fs/2 に相当するフーリエ係数を表示する】

ans =

-0.000000000002508 -1.000000000000000 【cosのみ振幅と位相を表せる】

図 4 Nyquist 周波数の正弦波の波形、振幅スペクトル、位相スペクトル

畳み込み演算について

3節の作業で使用する filterout.mでは、フィルタ処理対象の信号を離散フーリエ変換したフーリ

Page 8: オシロスコープと信号処理 信号処理編 テキストct13050/johogaku/2-2.signal...4 MATLAB 関数fftは正規化係数を1 としており、fftの結果から振幅を求めるには標本数N

8

エ係数を通過周波数帯ではそのまま(1 を掛けたもの)、遮断周波数帯では 0(0 を掛けたもの)として、

これを逆変換して時間領域に戻したものを返している。元の信号のフーリエ係数に周波数に応じて掛け

る値(ここでは 1 と 0 のみ)はフィルタのインパルス応答(impulse response:IR と略される)を周

波数領域に変換したもので、IR を用いたフィルタ処理は時間領域では畳み込み演算(註参照)と呼ばれ

標本数を N とするとき計算量は N2のオーダーである。

時間領域での畳み込み演算は、周波数領域では単純な要素毎の乗算となり計算量は N のオーダーで済

むため、FFT による離散フーリエ変換・逆変換(計算量はそれぞれ Nlog2N のオーダー)のコストを考

慮しても周波数領域に変換して処理して時間領域に戻す方が(N がシステムで扱える FFT のサイズを

超える場合には分割して処理するが)圧倒的に有利である。

註:信号と IR を、一方の時間軸を逆向きにして並べ対応する要素同士の積の和を求め、これを要素の

対応をずらしながら信号長分について行うもので、この過程は位取り表記で乗算を筆算で行う際に被乗

数と乗数の重みを考慮して部分積を求め、桁を揃えて和を取ることと同じである。実際、多倍長演算の

乗算では FFT を利用している。

● インパルス

サウンドカードの周波数特性を正確に見る課題Ⅰ②の任意作業では、窓関数「なし(矩形)」に設定

した WaveSpectra の分析区間に 1 個だけ含まれる「パルス」を WaveGene で再生してパルスのスペクト

ルが(分析可能な)周波数全域で同じ振幅をもつことを確認した(課題Ⅰ②テキスト pp. 9-10)。

以下では逆に周波数全域で同じ振幅をもつフーリエ係数を時間領域に変換するとパルスとなること

を確認する。ここで得られるyが、3節で使用するフィルタの周波数応答の元となるインパルスである。

以下に見る様に、振幅スペクトルが 1 となる様に選ぶとき、yの 1 行目の要素は N/2 となる。

Fs=8192; Td=5; N=Fs*Td;⏎

Y=ones(N,2)/2;⏎ 【全周波数で振幅が 1となるフーリエ係数は 1/2】

y=ifft(Y*N);⏎ 【時間領域に変換する】

nnz(y)⏎ 【非零の要素の数を表示する】

ans =

2 【2個(行列の 1行分)あることが分る】

[M I v]=find(y)⏎ 【非零の要素の行、列、値を表示する】

M =

1

1 【第 1行第 1列と】

I =

1

2 【第 1行第 2列の 2個の要素で】

v =

20480

20480 【値は共に N/2である】

● フィルタのインパルス応答

フィルタ処理で畳み込まれる IR は前項で生成したインパルス y にフィルタ処理をした出力信号(以

下の例では z)で、フィルタの周波数応答はそのスペクトルを表示して確認できる。以下はインパルス

Page 9: オシロスコープと信号処理 信号処理編 テキストct13050/johogaku/2-2.signal...4 MATLAB 関数fftは正規化係数を1 としており、fftの結果から振幅を求めるには標本数N

9

を本課題で使用する filterout.mではなく、afilterout.m(課題Ⅰ②で扱った CR/LR フィルタの

特性を持たせたもので、段数の指定ができるもの)で処理した例である。CR/LR フィルタでは遮断側で

位相がπ/2(遮断周波数ではπ/4)回転するため、これを 2 段重ねたものではπ(遮断周波数ではπ/2)

回転することが分る。

z=afilterout(y,Fs,[0 1;64 64;2 2]);⏎ 【HPF/LPF、遮断周波数 64Hz、2段】

Z=plotspec(z,Fs,[0 1+i -10^-6 -4]);⏎ 【位相表示の振幅閾値を 10-6とする】

図 5 afilteroutによる振幅(左)、位相(右)の周波数応答の例

● 残響付加

MATLAB には次数の大きな有限インパルス応答(finite impulse response:FIR)によるフィルタ処

理を FFT で行う関数 fftfiltが用意されている。中身はオーバーラップ加算法による畳み込み演算で

あり、フィルタ係数の代りにコンサートホール、大聖堂、トンネル等(註参照)の IR を指定すること

で音源に好みの残響を付加することができる。

興味のある人は「現在のフォルダー」に音源(例えば情報学実験のページから課題Ⅱ⑤の bansou.wav)

と IR(例えば註の URL から York Minster の IR:minster1_000_ortf_48k.wav)の wav ファイルを置

いて MATLAB_sample.zip 中の fftfilt_test.m(内容は p. 25 参照)を実行(処理結果は「現在の

フォルダー」にファイル名’ bansou_minster1_000_ortf_48k.wav’で保存される)してみることを推奨す

る。

註:商用の畳み込み残響付加専用のソフトウェアで使われる左右(と中央)の音源に対する左右の応答

からなる 4~6 チャンネル分の IR(”True Stereo”と称する)ではないが、商用の波形編集ソフトウェア

のツール(中央の音源に対する左右の応答からなる 2 チャンネル分の IR を使用)と同等な品位の IR が

以下の URL から自由にダウンロードできる。

Openair Impulse response database

http://www.openairlib.net/auralizationdb

Page 10: オシロスコープと信号処理 信号処理編 テキストct13050/johogaku/2-2.signal...4 MATLAB 関数fftは正規化係数を1 としており、fftの結果から振幅を求めるには標本数N

10

実験手順

0.必要なファイルを「現在のフォルダー」に置く。【事前準備として必ず実験時限以前に行うこと】

情報学実験のページから MATLAB_sample.zip をダウンロード、解凍し MATLAB の「現在のフォル

ダー」に置く(操作は[オシロスコープ編]テキスト p. 3 実験手順0節参照)。MATLAB を起動し「現在

のフォルダー」にドラッグ&ドロップした場合はファイルの作成日時、更新日時共にドロップの時刻と

なるが、エクスプローラーでコピーした場合には作成日時のみがドロップの時刻となり更新日時は元の

ファイル情報のままになる。

本課題の実行時に呼出す 3 本の関数(plotwave.m、plotspec.m、filterout.m)については備

考 p. 18 以降の各関数のパラメータと呼出し例について十分理解しておくこと。

注意

以下の各節の作業では、次の項目に留意し、必要に応じ MATLAB 参考資料を参照すること。

● ログの採取について

MATLAB では関数 diaryでログ採取を設定して(例:diary yyyymmdd.txt⏎)コマンドウィンド

ウへのキーボード入力と結果出力をテキストファイルとして保存できる(採取停止は diary off⏎)

ので、ログ採取を強く推奨する。ファイル名を指定しない既定では「現在のフォルダー」に拡張子無し

の’diary’ファイルを作成して記録され、既に(指定ファイル名、指定の無い場合は既定の)ログファイ

ルが存在するときはこれに追記される。ログファイルの識別と作業時刻の確定のため、ログ採取の開始

直後に pwd⏎と datetime now⏎を入力し、「現在のフォルダー」とログ採取の日付と時刻を記録して

おくとよい。

スクリプトを編集しながら実行する場合、作業内容を明確にするため随時 dir⏎(「現在のフォルダ

ー」内の全てのファイル名を表示)、what⏎(拡張子.mおよび.matの MATLAB ファイル名のみ表示)、

type filename⏎ (指定ファイルの内容を表示。M ファイルでは拡張子.m は省略可。ユーザが作成した

スクリプト、関数だけではなく、組み込み関数以外の MATLAB 関数の内容も表示できる)、whos⏎(ワ

ークスペースの変数リストを表示)を入力し、ログに情報として残しておくこと。

● スクリプト、変数の名称について

スクリプト、関数を作成する場合、MATLAB の関数と同一の名称を付けないこと。name という関数

が存在するか否かの確認は、exist name⏎(help name⏎、type name⏎ でもよいが、直接 name⏎ と

入力することは推奨しない)と入力してみればよい(存在するとき 2 または 5:5 は組み込み関数、存

在しなければ 0 を返す)。MATLAB では予約されている e、pi、i、j にも値の代入が可能で代入結果

が優先するが、これらをループ変数に使用したりしないこと。

1.Nyquist 周波数を超える周波数を指定した場合に生成される信号を確認する。

以下のコマンドを(個々に直接コマンドウィンドウに入力してもよいが M ファイルのスクリプトと

して作成しておくとよい)入力して左右から同じ周波数の音が聞えることを確認しなさい。ここで、f 1

は各自の学籍番号下 3 桁を十進数とみた値に 280 を加えた数とし、 f 2は Fs - f 1、k は Td * f 1 +1と

する。波形とスペクトルの Figure をキャプチャ(各 Figure を個別に全画面に拡大してキャプチャする

Page 11: オシロスコープと信号処理 信号処理編 テキストct13050/johogaku/2-2.signal...4 MATLAB 関数fftは正規化係数を1 としており、fftの結果から振幅を求めるには標本数N

11

必要は無く、複数の Figure を同一画面に表示してキャプチャして構わない)してファイルに保存し、

Y(k,:)の出力結果を実験ノートに記録すること。

Fs=8192; Td=5; N=Fs*Td;⏎ 【Fsは MATLAB 既定の 8192、Tdは正の整数とすること】

p=2*pi*(0:N-1)/Fs;⏎ 【位相ベクトルを定義する】

x1=-sin(f 1*p);⏎ 【振幅 1周波数 f 1[Hz]負極性の sin(位相π/2)】

x2=-cos(f 2*p);⏎ 【振幅 1周波数 f 2[Hz]負極性の cos(位相±π)】

y=[x1' x2'];⏎ 【転置して連結する】

plotwave(y,Fs,[0 0.01]);⏎ 【波形を表示する(例:0~0.01秒):図 6左】

sound(y);⏎ 【既定の標本化周波数(8192Hz)で再生される】

att=1-2^-15;⏎ 【信号±1 を 16 ビット音声データ 0x7FFF/0x8001 に合せる減衰係数(次節参照)】

audiowrite('alias.wav',y*att,Fs);⏎ 【減衰係数を掛けて保存する】

Y=plotspec(y);⏎ 【スペクトルを既定オプションで表示する(図 6中右に抜粋)】

Y(k,:)⏎ 【フーリエ係数を表示する:実験ノートに記録すること】

図 6 周波数の和が標本化周波数となる 2 本の正弦波の波形、振幅スペクトル、位相スペクトル

plotwave.m、plotspec.mでは、2 チャンネルの信号は左、右の順に同一の Figure に表示するが、

図 6 中の振幅スペクトルでは赤(右チャンネル)のみが表示されている。これは、MATLAB では Figure

に hold on で重ねてプロットした場合に上書き表示される(MATLAB 互換のオープンソース Octave

では重なっていることが分る表示が工夫されている)ためである。

本例(f 1=440、f 2=7752)では図 6 右の位相スペクトルで-πと表示されている負極性の cosの位相

(途中計算の誤差の累積により±πの何れにも表示され得る)についても f 2 の値によっては -πでは

なくπと表示され左チャンネルのπ/2 が隠される可能性がある。この場合には、plotspec(x1');⏎

(または plotspec(y(:,1));⏎)と入力して左チャンネルのみのスペクトルを表示して確認しなさ

い。

2.信号の絶対値が 1 を超えて音声ファイルへの保存で切捨てられる場合の違いについて確認する。

MATLAB では、音声信号を audiowrite関数でファイルに書込むとき、音声ファイルの絶対値最大

標本(0dBFS)に対応する音声信号の絶対値は、ビット深度を nb とするとき (2nb-1-1) / 2nb-1 = 1-21-nb

である(1 ではないことに注意。備考 p. 17「音声ファイルの入出力について」参照)。したがって絶対

値が 1 以上の信号をファイルに保存した場合には切捨てられて歪を生じるが、正弦波の振幅(複数の正

弦波を重ね合せたときは各正弦波の振幅の和)が 1 を超えて切捨てられる場合と、正弦波の振幅(重ね

Page 12: オシロスコープと信号処理 信号処理編 テキストct13050/johogaku/2-2.signal...4 MATLAB 関数fftは正規化係数を1 としており、fftの結果から振幅を求めるには標本数N

12

合せたときは和)は 1 を超えないが白色雑音を加えた結果 1 を超えて切捨てられた場合とは性質が異な

る。前者では超過切捨てによって生じた高調波成分(課題Ⅰ⑦の矩形波の奇数次高調波を思い出して頂

きたい。以下の例で 70*3=210[Hz])と唸り(150-70*2=10[Hz]、150*2-70=230[Hz])が見られる

が(図 7 下段中右の青)、後者では切捨てにより正弦波の振幅が原信号よりも小さくなるものの、雑音

には原信号と相関が無いことから原信号に含まれない周波数成分が現れることはない(図 7 下段中右の

赤)。ここでは、白色雑音として平均 0 分散 1 の標準正規分布 N(0,1)に従う正規乱数 randnを用いる(実

効値は 1 であり、同じ正規乱数による WaveGene の 0dB で生成する「ホワイトノイズ」より約 10.88dB 高い)。

以下のコマンドを入力してこのことを確認しなさい。ここでは「clear; close all⏎」は入力せ

ず、前節で設定した標本パラメータ、位相ベクトルを引き続き使用する。M ファイルのスクリプトとし

て作成して実行する場合は、複数回引用される sound関数の再生音が重ならない様に pause関数で時

間調整(互換オープンソースの Octave では不要)をする必要がある(コマンドとして 1 行ずつ入力す

る場合は再生終了後に次のコマンドを入力すれば不要)。

この例ではスペクトルのプロットで重ならない様に左右で正弦波の周波数を変え、波形表示の

plotwaveでは、0~0.01 秒の波形を表示し、スペクトル表示の plotspecのオプションでは、周波数

範囲を 0Hz~250Hz、位相スペクトルの表示をπで割った値とし、振幅閾値を 10-2、振幅スペクトルの

対数軸レンジを 3 桁とし、グリッドを表示しているが、生成する正弦波の周波数により適切な表示範囲

を選びなさい。

実験では、以下の例とは正弦波の振幅、周波数を変えて実行して、実験ノートにこれらのパラメータ

ならびに max(y)および min(y)の値を記録し、波形とスペクトルの Figure をキャプチャしてファイル

に保存しなさい。本節の作業では、レポートの考察上で重要と思われる Figure は個別に全画面に拡大

してキャプチャすること。

図 7 絶対値 1 を超える音声信号の保存前(上段)、保存後(下段)の波形(左)とスペクトル(中右)

x1=1.3*sin(70*p)+0.7*sin(150*p);⏎ 【正弦波そのものが絶対値 1を超える】

Page 13: オシロスコープと信号処理 信号処理編 テキストct13050/johogaku/2-2.signal...4 MATLAB 関数fftは正規化係数を1 としており、fftの結果から振幅を求めるには標本数N

13

x2=0.5*sin(90*p)+0.4*sin(120*p)+randn(size(p));⏎ 【ノイズにより絶対値 1を超える】

y=[x1' x2'];⏎ 【転置して連結する】

max(y)⏎ 【最大値を表示する:実験ノートに記録すること】

min(y)⏎ 【最小値を表示する:実験ノートに記録すること】

plotwave(y,Fs,[0 0.01]);⏎ 【波形を表示する(例:0~0.01秒):p. 12 図 7上左】

sound(y);⏎ 【再生して確認する】

audiowrite('clipped.wav',y,Fs);⏎ 【wav ファイルに保存する】

Y=plotspec(y,Fs,[0 250 -10^-2 -3]);⏎ 【スペクトルを表示する(図 7上中右に抜粋】

[z,Fs]=audioread('clipped.wav');⏎ 【保存した wavファイルを読出す】

pause(Td);⏎ 【スクリプトとして実行する場合は前の再生音と重ならない様に処理を休止する】

sound(z);⏎ 【再生して確認する】

plotwave(z,Fs,[0 0.01]);⏎ 【波形を表示する(例:0~0.01秒):図 7下左】

Z=plotspec(z,Fs,[0 250 -10^-2 -3]);⏎ 【スペクトルを表示する(図 7下中右に抜粋)】

3.MATLAB 組込み音声に正弦波を重ね、これをフィルタ処理してそれぞれを分離する。

本節では load関数で MATLAB 組込み音声(ここでは笑い声とハレルヤの合唱のそれぞれについて

作業する。組込み音声の内容については p.18 備考を参照のこと)を読込み、これに 70Hz と 150Hz の

正弦波を重ねた後、filterout.mで高域通過および低域通過のフィルタ処理(註 1 参照)をして組込

み音声と正弦波とを分離する。元の音声信号の特徴となる周波数帯に含まれる周波数の正弦波を重ねた

場合には、このフィルタ処理(註 2 参照)で分離することはできない。

註 1:遮断周波数に対応する要素を含めて(直流通過の指定が可能な様に低域通過で遮断周波数に 0 を

指定した場合のみ異なる。詳細は p. 20 備考の関数の仕様を参照のこと)遮断側のフーリエ係数を 0 と

し、これを逆変換することで指定した周波数より高いまたは低い周波数成分のみを通過させるもので、

実時間処理を行うフィルタではこの様な特性を持たせることはできない。

註 2:filterout.m では本節での使用法以外に帯域幅を指定した通過、阻止の設定も可能である。興

味のある人は組込み音声に例えば 1kHz の正弦波を重ね、2 チャンネル化した音声 z とこれに帯域幅

999Hz~1001Hz を指定した u=filterout(z,Fs*i,[2 3; 999 999; 1001 1001]);⏎で処理し

た信号を比較しなさい。

以下はハレルヤ(MATLAB システムのファイル名は handel.mat)の例で、笑い声の場合は load

handel;⏎を load laughter;⏎に変え、保存する音声ファイル名も対応して変更する。f cは遮断周

波数(単位 Hz)の十進数字で、f cの値を実験ノートに記録し、分離できたことを確認したフィルタ処

理後の音声はこの f cの値が分る形で wav ファイルに保存すること。

clear; close all;⏎ 【ワークスペースをクリアし、Figureを削除する】

load handel;⏎ 【組込み音声データの信号、標本化周波数が y、Fsに読込まれる】

sound(y);⏎ 【再生して確認する(標本化周波数は MATLAB 既定値)】

N=length(y);⏎ 【重畳する正弦波を生成するため信号長を求める】

p=2*pi*(0:N-1)/Fs;⏎ 【位相ベクトルを作成する】

x=0.3*sin(70*p)+0.7*sin(150*p);⏎ 【正弦波を生成する】

Page 14: オシロスコープと信号処理 信号処理編 テキストct13050/johogaku/2-2.signal...4 MATLAB 関数fftは正規化係数を1 としており、fftの結果から振幅を求めるには標本数N

14

z=y+x';⏎ 【行ベクトルを列ベクトルに転置して音声信号に加算する】

z=z/max(abs(z));⏎ 【再生で歪まない様に絶対値最大を 1に正規化する】

pause(round(N/Fs));⏎ 【スクリプトとして実行する場合は前の再生音と重ならない様に処理を

休止する】

sound(z);⏎ 【再生して確認する(標本化周波数は MATLAB 既定値)】

plotwave(z,Fs,[0 0.1]);⏎ 【波形を表示する(例:0~0.1秒):図 8左】

plotspec(z);⏎ 【スペクトルを既定オプションで表示(図 8中右に抜粋)】

z=[z z];⏎ 【高域通過、低域通過を同時処理するため、2チャンネル化する】

att=1-2^-15;⏎ 【信号±1 を 16 ビット音声データ 0x7FFF/0x8001 に合せる減衰係数(前節参照)】

audiowrite('handel_mixed.wav',z*att,Fs);⏎ 【wavファイルとして書出す】

u=filterout(z,Fs*i,[0 1; f c f c]);⏎ 【高域通過、低域通過のフィルタ処理を行い、両チャン

ネル、左、右の順に 3回再生する】

audiowrite('handel_ f c.wav',u*att,Fs);⏎ 【wavファイルとして書出す】

plotwave(u,Fs,[0 0.1]);⏎ 【波形を表示する(例:0~0.1秒):図 9左】

plotspec(u);⏎ 【スペクトルを既定オプションで表示(図 9中右に抜粋)】

図 8 はハレルヤの合唱に正弦波を重ねた波形と振幅スペクトル、図 9 はこれにフィルタ処理をした例

である。

図 8 ハレルヤの合唱に正弦波を重ねた波形と振幅スペクトル

図 9 同じ遮断周波数を指定した高域通過(左チャンネル青)、低域通過(右チャンネル赤)の結果

本節の作業では f cの値を 70、150 の何れよりも大きな値でできるだけ小さくすればよいことはすぐ

に分るが、150Hz はハレルヤ、笑い声の何れの場合も信号長の逆数である周波数分解能(ハレルヤの場

合約 0.112Hz)の倍数ではない。p. 4図 1の 50.5Hzと 70Hzの正弦波の例でz=filterout(y,Fs*i,[3

50.45 50.55;3 69.95 70.05]');⏎と入力すると右チャンネルの 70Hz は完全に阻止されるが左チ

Page 15: オシロスコープと信号処理 信号処理編 テキストct13050/johogaku/2-2.signal...4 MATLAB 関数fftは正規化係数を1 としており、fftの結果から振幅を求めるには標本数N

15

ャンネルの 50.5Hz は(低域の周波数特性が悪いイヤホンでなければ)十分聞き取ることができる様に

振幅スペクトルでは周辺にも聴感上無視できないパワーを持つ要素がある。したがって単純に 150Hz

に周波数分解能を考慮した値を加えて f cの値とすればよいというものではないことに注意する。p. 14

図 8、9 では plotspec を既定パラメータで使用して周波数範囲を 0~Fs/2(対数軸では周波数分解能

が下限)としているが、Figureのメニューで「ズームイン」( )をクリックして 150Hz 付近を拡大

表示し、聴感と振幅スペクトルから最適と思われる f cの値を決定すること。

参考

正弦波を重ねて audiowrite で保存した音声ファイル(上記の例では'handel_mixed.wav')を

WaveGene の「ユーザー波形」に登録して WaveGene の「フィルター」(WaveGene ヘルプ「出力フィルター」

の項を参照のこと)をかけて再生すれば、本課題で使用するフィルタと同じものではないが、遮断周波

数と遮断特性を変化させたときの一般的なフィルタ処理結果をリアルタイムに耳で確認することがで

きる。「ユーザー波形」の再生はループ再生であることも都合がよい。音声ファイルは、「ユーザー波形登録」

を開かず WaveGene にドラッグ&ドロップすれば Wave1(Wave 1,2,3,4 が表示されているとき)また

は Wave5(Wave 5,6,7,8 が表示されているとき)の登録画面が波形が登録された状態で開くので、その

まま「閉じる」をクリックすればよい。

図 10 正弦波を重ねたハレルヤの合唱を高域通過フィルタで実時間処理した例

図 11 正弦波を重ねたハレルヤの合唱を低域通過フィルタで実時間処理した例

Page 16: オシロスコープと信号処理 信号処理編 テキストct13050/johogaku/2-2.signal...4 MATLAB 関数fftは正規化係数を1 としており、fftの結果から振幅を求めるには標本数N

16

WaveSpectra では wav ファイルをヘッダ情報から取得した標本化周波数で再生するが、信号生成ソ

フトの WaveGene では読込んだ波形は波形合成が目的であるため、元の標本化周波数とは無関係に標本

を WaveGene の「サンプリング周波数」で取出して再生する(既定の 44100Hz では 5 倍以上の早聞きにな

る)。「サンプリング周波数」の値(既定は 44100)をクリックし、青表示の状態で Delete(または BackSpace)

をクリックすると表示が 1000 となり左端にカーソルが位置するので 8192 と入力し、Delete を 4 回押

下する。

p.15 図 10、11 は WaveGene でフィルタ処理された再生信号を録音状態の WaveSpectra に(PC の

音声入出力ジャックをステレオ音声ケーブルで直結するのではなく)ループバック機能を持つオーディ

オインタフェースを用いて直接ディジタル入力して波形とスペクトルを見た例である。

以下の4、5節の作業は表紙交付基準には含まれていないが、レポートの記述には必ず含めること。

4.ごく短いデータに対し実際に離散フーリエ変換、逆変換を手計算で行い、MATLAB で検算する。

各自の学籍番号下4桁をd0d1d2d3とするとき、各桁を十進数とみた値から作られた時系列データ x(0)

= d0, x(1) = d1, x(2) = d2, x(3) = d3 に対するフーリエ係数(X(0)~X(3))を離散フーリエ変換の

定義(p. 3 参照)から筆算で求め、その逆変換についても定義により筆算で求め、結果を MATLAB で

検算しなさい。レポートには筆算の過程を記載すること。

5.負の周波数領域のスペクトルを表示する MATLAB プログラムを作成する。

前節までで使用したスペクトルプロットの関数 plotspec.m ではフーリエ係数の非負の周波数要素

のみを用いていた。フーリエ係数の後半の要素を周波数 0 の前に移動して、負の周波数を含む全ての要

素について振幅と位相を表示する MATLAB プログラムを plotspec.m を参考にして作成しなさい。

レポートにはプログラムのリストと実行結果の画面キャプチャを含めること。

ヒント

標本数 N が偶数の場合と奇数の場合とでは異なる(負数の表現での 2 の補数と 1 の補数の違いに似

ている)が統一した式で表すには次の様にすればよい。偶数の場合の N/2+1 番目の要素を周波数-Fs/2

に対応させて周波数軸の左端に置くとき、N2 = floor(N/2); N3 = floor((N+1)/2);として、標

本数で割ったフーリエ係数 Yを YD = circshift(Y,N2);で循環シフトする。このとき対応する周波

数軸のベクトルは f = Fs/N*linspace(-N2,N3-1,N);とすればよい。A = abs(YD); P =

angle(YD); でそれぞれ振幅(註参照)と位相が与えられる。位相については表示する要素について

振幅の閾値を設定し、例えば P(A<10^-2) = 0; とする。

註:パワーを表示するのか正弦波の振幅を表示するのか、直流(周波数 0)をどう見るかによって異な

るが、ここではフーリエ係数の絶対値そのものをプロットするので構わない。

Page 17: オシロスコープと信号処理 信号処理編 テキストct13050/johogaku/2-2.signal...4 MATLAB 関数fftは正規化係数を1 としており、fftの結果から振幅を求めるには標本数N

17

備考

レポート作成について

本課題の作業は全て実験時間以外に自由利用時間の演習室、カフェテリアの PC だけでなく情報科学

研究教育センターに下記 URL から申請書式をダウンロードして MathWorks TAH ライセンスの利用登

録と個別認証端末利用の申請をすれば個人所有 PC でも行うことが可能である。レポートでは、実験手

順で「表紙交付基準には含まれていないが、レポートの記述には必ず含めること。」と記載された部分

(必須)の他、余力があれば次の作業結果(任意)について報告すること。

① 1節の信号 yを Fs=16384;⏎として生成する(他のパラメータは変更無し)。

② z=filterout(y,Fs,[1;4096]);⏎ 【4096Hz 以上をカットする】

③ w=z(2:2:end,:);⏎ 【偶数行のみ取り出し標本化周波数 8192Hz の信号とする】

④ 信号 wの波形、スペクトルを表示する。 【1節の結果と比較考察しなさい】

MathWorks TAH ライセンス関連申請書式(学内からのみアクセス可)

http://www.cc.kogakuin.ac.jp/doc/mathworks-id-regist.doc

http://www.cc.kogakuin.ac.jp/doc/mathworks-license-auth.doc

音声ファイルの入出力について

MATLAB では、audioread、audiowrite でそれぞれ音声ファイルの読み込みと書き出しを行う。2015

年度まで使用していた R2014b では従来版との互換性のために残されていた wavread、wavwrite は

R2015b で削除された。

課題Ⅰ②、課題Ⅰ⑦、課題Ⅱ②[オシロスコープ編]で使用した WaveGene では、「ビット長」の指定

値を nbとするとき、dB で表した「振幅」が 0(このとき、単位欄の「dB」を右クリックして「数値」

を選ぶと 2^(nb-1)-1の整数値が表示される。ただし、nbが 24 以上の場合には 16 ビットに換算した

値を示し、例えば nb が 24 の場合には 256 で割った 32767.99609375 と表示される)である絶対値最

大の正負の標本は nb = 8、16、24 の場合、ファイル上でそれぞれ 0xFF/0x01(8 ビット表現の音声デ

ータは 2 の補数ではなく 128 バイアス)、0x7FFF/0x8001、0x7FFFFF/0x800001となる。

WaveGene の書出しと読込みの仕様は対称ではないことに注意する。WaveGene の「ユーザー波形」で

音声ファイルを読込むとき、波形合成の規格化の基準値はファイル上で表現可能な最大絶対値

2^(nb-1)-1ではなく、2^(nb-1)であるため、読込んだファイルをそのまま「振幅」を 0dB(増幅減

衰無し)で書出した音声ファイルのレベルは元のファイルよりも僅かながら減衰している。

WaveSpectra の読込みも同様で、「振幅」が 0dB の「M 系列ノイズ」を nbを変えて音声ファイルに出

力して、これを WaveSpectra で読込んで再生すると分る様に、基準となる 0dB は 2^(nb-1)-1 では

なく、2^(nb-1)である。16 ビット以上ではその差は分らないが、8 ビットで保存した 0dB M 系列ノイズ

を再生するとレベルメーターの値は 0.0ではなく 20log10(127/128)を四捨五入した-0.1を示す。

MATLAB の現在の版では、読込み・書出し共に内部表現の値 ±{2^(nb-1)-1}/{2^(nb-1)}を絶

対値最大の標本に対応させており、audioread と audiowrite の仕様は対称である。ただし、古い版では

(MATLAB 互換のオープンソース Octave では現在の 4.0.0 でも)、書出しで内部表現の±1 を絶対値最

大の標本に対応させる(WaveGene/WaveSpectra の非対称と同様の関係)ので注意を要する。

Page 18: オシロスコープと信号処理 信号処理編 テキストct13050/johogaku/2-2.signal...4 MATLAB 関数fftは正規化係数を1 としており、fftの結果から振幅を求めるには標本数N

18

MATLAB 組込みの音声サンプルについて

本課題では、システムに組込まれた MAT ファイル(拡張子.mat)を load コマンドで指定してハレル

ヤと笑い声のデータをワークスペースに読込んで使用する。MATLAB では変数、スクリプト(拡張子.m

のファイル)は大文字と小文字を区別するが、MAT ファイルでは区別しない。MAT ファイルから読込

まれた内容はワークスペースのウィンドウで確認できるが、直接には whos –file handel(ハレル

ヤの場合)と入力すると

Name Size Bytes Class Attributes

Fs 1x1 8 double

y 73113x1 584904 double

と表示され、標本化周波数は Fs、73113 標本の音声データが列ベクトル y に読込まれたことが分る。標

本値の絶対値最大、実効値はそれぞれ max(abs(y))、rms(y)で確認できる。音声データには他に今

回使用していない mtlb(発音 mæʈləb)と gong(鐘の音)があるが、何れも絶対値最大が 1 を超える

ので再生、保存には正規化の必要がある。mtlb の音声データは標準の y ではなく mtlb に読込まれるの

でファイルに保存して利用する場合は、例えば audiowrite('mtlb_normalized.wav',mtlb/

max(abs(mtlb))*(1-2^-15),Fs)の様に入力する。表 1 に組込み音声データの仕様をまとめる。

表 1 MATLAB 組込みの音声データ

handel laughter mtlb gong

Fs 8192 8192 7418 8192

標本数 73113 52634 4001 42028

絶対値最大 0.8 1 3.093054 1.057567

実効値 0.196228 0.1612299 0.660581 0.153765

格納先 y y mtlb y

MATLAB_sample.zip の内容について

信号処理編に関係するファイルは以下の通りである。オシロスコープ編の関係ファイルは[オシロス

コープ編]テキストを参照のこと。

● 関数プログラム

何れの関数も必須のパラメータ以外は既定解釈により省略可能である。各関数の呼び出しの実例はサ

ンプルプログラムのソースを参照されたい。

(1) plotwave.m

関数定義行:function plotwave(x,fs,limit,alpha);

引数: x : 音声信号(標本数×チャンネル数の行列)【必須】行ベクトルの音声信号は転置して指定す

ること。

|fs| : 標本化周波数(単位 Hz、既定値 8192)fsが正でない場合、音声信号を再生する。

limit : 最大 1×5 の行列で、横軸の範囲(要素 2 個:1 個以上が実数ではない場合、実部が信号

長で規格化した値を表す)、縦軸の範囲(要素 2 個:縦軸の係数を指定する場合の便宜のた

め、上下限に同じ値を指定した場合、既定値となる。)、縦軸の係数(絶対値が係数を示し、

Page 19: オシロスコープと信号処理 信号処理編 テキストct13050/johogaku/2-2.signal...4 MATLAB 関数fftは正規化係数を1 としており、fftの結果から振幅を求めるには標本数N

19

負数を指定した場合グリッドを表示する。0 を指定した場合、-1 とする)の順。

alpha : タイトルの文字列(既定文字列を置換える)

音声信号と描画パラメータを引数として入力し、波形を両軸リニアでプロットする。チャンネル数×

標本数のデータを入力するとメッセージを表示して終了する。2 チャンネルデータの場合、左を青、右

を赤(PicoScope 6 の既定の色に揃えている)で重ねて表示する。既定の標本化周波数は 8192Hz、既

定の横軸は信号の全区間、縦軸は a を横軸の区間の標本絶対値最大とするとき±1.05×a、既定のタイ

トルは Audio data : xxs - xxs である。横軸の範囲の 1 個以上の要素が実数でない場合、範囲の実部が

信号長で規格化した値を示す。標本化周波数に正でない値を指定した場合、その絶対値が使用され、音

声信号を再生する。範囲パラメータの 5 個目(オプション)で縦軸の範囲(1/1.05 でマージン無しの表

示)とグリッド表示(パラメータが負または 0)を設定する。

呼び出し例:

plotwave(y,-Fs); 標本化周波数 Fs の音声信号 y を既定の軸、既定のタイトルでプロットし、音

声信号を再生する。

plotwave(y,Fs,[0.1 0.2],'Original data'); 標本化周波数 Fsの音声信号 yを横軸は 0.1~

0.2 秒、縦軸は aをこの範囲の標本絶対値最大とするとき±1.05×a、タイトルを Original data : 0.1s –

0.2s としてプロットする。

plotwave(y,Fs,[0 0.2 0 0 -1/1.05]); 標本化周波数 Fsの音声信号 yを横軸は 0~0.2 秒、縦

軸をマージン無し、既定のタイトル(Audio data : 0s – 0.2s)でプロットし、グリッドを表示する。

plotwave(y,Fs,[0.2 1+i]); 標本化周波数 Fsの音声信号 yを横軸は信号長の 0.2~1 倍、縦軸は

-1~1、既定のタイトル(Audio data : xxs – xxs)でプロットする。

(2)plotspec.m

関数定義行:function [Y,n_p]=plotspec(x,fs,limit,alpha);

引数: x : 音声信号(標本数×チャンネル数の行列)【必須】行ベクトルの音声信号は転置して指定す

ること。

|fs| : 標本化周波数(単位 Hz、既定値 8192)fsが正でない場合、音声信号を再生する。

limit : 最大 1×4 の行列で、横軸の範囲(要素 2 個:1 個以上が実数ではない場合、実部が Nyquist

周波数で規格化した値を表す)、位相をプロットする振幅の閾値(要素 1 個。正でない値は

絶対値を用い、位相をπで割った値をプロットする)、表示制御(要素1個。実部の絶対値

で対数軸振幅スペクトルのレンジを指定する。既定は 7(140dB)で負の値を指定した場合、

絶対値を採用しグリッドを表示し、0 を指定した場合、-7 とする。虚部は振幅スペクトル

の補正カーブで 10dB/decade を単位とする)の順。

alpha : タイトルの文字列(既定文字列の左に連結される)

戻り値:音声信号 xの FFT 結果(標本数で割って正規化係数を 1/標本数としたもの)、振幅閾値以上の

位相データの個数。

音声信号と描画パラメータを引数として入力し、振幅、位相両スペクトルの周波数軸をリニア、対数

でプロットする(Figure は 4 個生成される)。チャンネル数×標本数のデータを入力するとメッセージ

を表示して終了するので転置して指定する。既定の標本化周波数は 8192Hz、既定の横軸の範囲は標本

化周波数を Fs とするとき、周波数軸がリニアのとき 0~Fs/2、対数のとき標本数を N としてFs/N~Fs/2

である。横軸の範囲の 1 個以上の要素が実数でない場合、範囲の実部が Fs/2 で規格化した値を示す。

位相の縦軸の範囲は±π(正でない閾値を指定した場合、±1)で、振幅の縦軸は a をこの周波数範囲

の最大振幅とするとき、周波数軸がリニアのとき 0~1.05×a、対数のとき既定は 1.05×a×10-7~1.05

Page 20: オシロスコープと信号処理 信号処理編 テキストct13050/johogaku/2-2.signal...4 MATLAB 関数fftは正規化係数を1 としており、fftの結果から振幅を求めるには標本数N

20

×aである。

位相スペクトルの表示では、フーリエ係数の偏角を全て表示すると殆どが±πの範囲の一様乱数のプ

ロットとなるため、意味のあるデータのみを表示する目的で振幅の閾値を設定する。既定の閾値は 10-3

(-60dB)である。閾値に正でない値を指定した場合、その絶対値が使用され、位相をπで割った値を

プロットする。

既定のタイトルは xxHz - xxHz の左に振幅では'Amplitude Spectrum : '、位相では'Phase Spectrum :

'、右にリニアでは' (linear scale)'、対数では' (logarithmic scale)'が連結される。

2 チャンネルデータの場合、左を青、右を赤で重ねて表示すること、標本化周波数に正でない値を指

定した場合、その絶対値が使用され音声信号を再生すること、範囲パラメータの最後の値(オプション)

で縦軸の範囲とグリッド表示を制御すること、何れも plotwave.m と同様であるが、plotwave.m と

異なる点として FFT 結果を値として返すことと、振幅スペクトルの周波数の冪乗による補正(呼び出

し例はサンプルプログラム LCR_test.mを参照)を指定できることである。

呼び出し例:

plotspec(y); 既定の標本化周波数の音声信号 yを、既定の軸、既定のタイトルでプロットする。

plotspec(y,Fs,[20 500 10^-2 -3]); 標本化周波数 Fsの音声信号 yを、横軸は 20Hz~500Hz、

位相スペクトルを振幅閾値 10-2(-40dB)でプロットし、対数軸振幅スペクトルのレンジを 60dB(|-3|

×20dB)とし、グリッドを表示する。

plotspec(y,-Fs,[10 2000 -10^-2]); 標本化周波数 Fsの音声信号 yを、横軸は 10Hz~2000Hz、

位相スペクトルを振幅閾値 10-2(-40dB)で、位相÷πをプロットし、音声信号を再生する。

plotspec(y,Fs,[0.2 0.8+i]); 標本化周波数 Fsの音声信号 yを、横軸は Nyquist 周波数の 0.2

~0.8 倍の周波数範囲で、既定のタイトルでプロットする。

plotspec(y,Fs,[20 Fs/2 -10^-2 -3+i); 標本化周波数Fsの音声信号yを、横軸は20Hz~Fs/2、

位相スペクトルを振幅閾値 10-2(-40dB)で、位相÷πをプロットし、対数軸振幅スペクトルのレンジ

を 60dB(|-3|×20dB)とし、グリッドを表示し、振幅スペクトルに+10dB/dec.の補正をする。

Y=plotspec(y,Fs,[20 500],'Sinusoids - '); 標本化周波数 Fsの音声信号 yを、横軸は 20Hz

~500Hz、既定のタイトルの左に'Sinusoids - 'を連結してプロットし、FFT の結果を Y に格納する。

(3)filterout.m

関数定義行:function z=filterout(x,fs,freq);

引数: x : 音声信号(標本数×チャンネル数の行列)【必須】行ベクトルの音声信号は転置して指定す

ること。

|fs| : 標本化周波数(単位 Hz、既定値 8192)fsが正でない場合、音声信号を再生する。音声

信号がステレオで fsの虚部が 0 でない場合、ステレオ、左、右の順に 3 回再生する。

freq : 最大 3×2 の行列で、フィルタのパラメータを指定する。列データは第 1 列が左、第 2

列が右のチャンネルに対応する。音声信号がモノラルの場合、第 2 列は無視され、音声信号

がステレオでパラメータが第 1 列のみの場合、両チャンネルに同じ処理を行う。第 1 行はフ

ィルタの種類を示し、0/1/2/3 がそれぞれ高域通過/低域通過/帯域通過/帯域阻止フィルタを

指定する。遮断型では第 2 行で遮断周波数を指定し、帯域型では第 2 行と第 3 行で帯域の両

端の周波数(大小の順序は自由で低域端、高域端の順でなくてもよい)を指定する。

戻り値:音声信号 xのフィルタ処理結果。

音声信号とフィルタパラメータを引数として入力し、フィルタ処理された信号を値として返す。チャ

ンネル数×標本数のデータを入力するとメッセージを表示して終了する。既定の標本化周波数は

8192Hz、既定のフィルタ処理は遮断周波数が√(Fs/2)、左チャンネルが高域通過、右チャンネルが低域

Page 21: オシロスコープと信号処理 信号処理編 テキストct13050/johogaku/2-2.signal...4 MATLAB 関数fftは正規化係数を1 としており、fftの結果から振幅を求めるには標本数N

21

通過(音声信号がモノラルの場合、右チャンネルのパラメータは無視される)である。遮断周波数は何

れのフィルタでも遮断される側に入る。ただし、遮断型で遮断周波数 0を指定した場合、高域通過フィ

ルタでは直流カット、低域通過フィルタでは直流のみ通過となる。

標本化周波数に正でない値を指定した場合、その絶対値が使用され、音声信号を再生することは

plotwave.m、plotspec.mと同様であるが、虚部が 0 ではなく音声信号がステレオの場合、チャンネ

ル毎の再生も行う。

呼び出し例:

z=filterout(y,-Fs,[0 1 ; 100 200]); 標本化周波数 Fsの音声信号 yに左は遮断周波数 100Hz

の高域通過、右は 200Hz の低域通過(モノラル信号の場合無視)のフィルタ処理を行い再生し、処理

された音声信号を z に格納する。

z=filterout(y,Fs,[0 ; 100]); 標本化周波数 Fs の音声信号 y に(ステレオ音声信号の場合、

両チャンネルに)遮断周波数 100Hz の高域通過フィルタ処理を行い、処理された音声信号を z に格納

する。

z=filterout(y,-Fs,[2 35 75; 3 120 180]'); 標本化周波数 Fsの音声信号 yに左は 35Hz~

75Hz の帯域通過、右は 120Hz~180Hz の帯域阻止(モノラル信号の場合無視)のフィルタ処理を行い

再生し、処理された音声信号を z に格納する。

z=filterout(y,Fs*i); 標本化周波数 Fsの音声信号 yに既定のフィルタ処理を行い再生し、処理

された音声信号を z に格納する。通常の再生後、ステレオ音声信号の場合、左チャンネル、右チャンネ

ルの順で単独で再生する。

(4)afilterout.m

関数定義行:function z=afilterout(x,fs,freq);

引数: x : 音声信号(標本数×チャンネル数の行列)【必須】行ベクトルの音声信号は転置して指定す

ること。

|fs| : 標本化周波数(単位 Hz、既定値 8192)fsが正でない場合、音声信号を再生する。音声

信号がステレオで fsの虚部が 0 でない場合、ステレオ、左、右の順に 3 回再生する。

freq : 最大 3×2 の行列で、フィルタのパラメータを指定する。列データは第 1 列が左、第 2

列が右のチャンネルに対応する。音声信号がモノラルの場合、第 2 列は無視され、音声信号

がステレオでパラメータが第 1 列のみの場合、両チャンネルに同じ処理を行う。第 1 行はフ

ィルタの種類を示し、0/1 がそれぞれ高域通過/低域通過を指定する。第 3 行はアナログフィ

ルタの段数で既定値は 1(-20dB/decade)である。

戻り値:音声信号 xのフィルタ処理結果。

音声信号とフィルタパラメータを引数として入力し、アナログ回路と同じ特性のフィルタ処理をした

信号を返す。チャンネル数×標本数のデータを入力するとメッセージを表示して終了する。既定の標本

化周波数は 8192Hz、既定のフィルタ処理は遮断周波数が√(Fs/2)、左チャンネルが高域通過、右チャン

ネルが低域通過(音声信号がモノラルの場合、右チャンネルのパラメータは無視される)、既定の段数

は 1(課題Ⅰ②の CR フィルタ、LR フィルタの特性と同じ)である。標本化周波数に正でない値を指定

した場合、その絶対値が使用され、音声信号を再生すること、虚部が 0 ではなく音声信号がステレオの

場合、チャンネル毎の再生も行うことは filterout.mと同様である。

呼び出し例:

z=afilterout(y,-Fs,[0 1 ; 100 200]); 標本化周波数 Fsの音声信号 yに左は遮断周波数 100Hz

の高域通過、右は 200Hz の低域通過(モノラル信号の場合無視)の各 1 段のフィルタ処理を行い再生

し、処理された音声信号を z に格納する。

Page 22: オシロスコープと信号処理 信号処理編 テキストct13050/johogaku/2-2.signal...4 MATLAB 関数fftは正規化係数を1 としており、fftの結果から振幅を求めるには標本数N

22

z=afilterout(y,Fs,[0 ; 100]); 標本化周波数 Fs の音声信号 y に(ステレオ音声信号の場合、

両チャンネルに)遮断周波数 100Hz、1 段の高域通過フィルタ処理を行い、処理された音声信号を z に

格納する。

z=afilterout(y,Fs,[0 100 3; 1 200 4]'); 標本化周波数 Fsの音声信号 yに左は遮断周波数

100Hz の高域通過 3 段、右は 200Hz の低域通過 4 段(モノラル信号の場合無視)のフィルタ処理を行

い、処理された音声信号を z に格納する。

● サンプルプログラム

plotwave.m、plotspec.mによる波形、スペクトルの描画、filterout.m、afilterout.mによ

るフィルタ処理の実行例と MATLAB 関数 fftfilt を用いた畳み込みプログラムである。(1)、(2)、

(6)のプログラムには入力が無いが、(3)のプログラムはファイル名と波形表示区間の入力(必須)、(4)

のプログラムはファイル名の入力(省略時の既定処理あり)、(5)のプログラムは回路構成と測定素子の

記号入力(省略時の既定処理あり)をプロンプトする。

(1)soundtest.m

標本化周波数 8192Hz で正弦波を重ね合せた5秒間の信号を生成し、再生、波形表示、スペクトル表

示を行い、これに正規白色雑音を加えた信号(終了時に行列 y に格納される)を同様に再生、波形表示、

スペクトル表示を行う。「現在のフォルダー」に plotwave.m および plotspec.m を置いて実行する

(両関数が無い状態ではメッセージを表示して終了する)。

図 12 は生成された 10 個の Figure を順に並べたもので、上段は正弦波の合成、下段はこれに正規白

色雑音を加えたものを示し、それぞれ左から plotwave による 0.1s~0.2s の波形、plotspec による

-10Hz~250Hz のスペクトルである。周波数の下限を 0Hz としたのでは直流成分の値が軸に重なって

読めないため周波数下限に負の値を設定している(対数軸での下限は既定値で信号長の逆数の 0.2Hz に

設定される)。左から振幅スペクトル(リニア、両対数)、位相スペクトル(リニア、片対数)の順で、

オプションで位相はπで割った値をプロットしグリッドを表示している。

直流成分(左チャンネルの -0.2)と 40Hz の成分(左チャンネルの-0.1*cos(2*pi*40*t))の位

相はπであるが計算精度により±πの何れにも表示され得る。原信号では(同じ CPU で組込み関数の

実装も同じである限り)毎回同じ値(ここでは直流、40Hz 共にπ)となるが、ノイズを付加した下段

は実行時の乱数初期値により±πの何れにもなる(この例では直流がπ、40Hz が-π)。合成する正弦

波の周波数と振幅、オフセットの値(ソースの 18、19 行)、付加するノイズのパワー(26 行)を変え

て(必要に応じて 22、31 行の plotwave、24、33 行の plotspec の範囲、閾値も変えて)実行して

みることを推奨する。

図 12 雑音の付加による波形とスペクトルの比較

Page 23: オシロスコープと信号処理 信号処理編 テキストct13050/johogaku/2-2.signal...4 MATLAB 関数fftは正規化係数を1 としており、fftの結果から振幅を求めるには標本数N

23

(2)filtertest.m

50ms の無音区間に続いて 20Hz~20kHz を 200ms でスイープする信号(1 回のみで繰返さない。註

1 参照)を生成し、初めに標本化周波数 44100Hz の 1/3(註 2 参照)を中心とする 4ms の波形を表示

し、続いて元の信号と 2 種類のフィルタ処理(遮断周波数で完全にカットする filterout.m、36 段で

-720dB/decade 減衰させる afilterout.m)を加えた信号の、再生(p. 24 註 3 参照)、波形表示、ス

ペクトル表示を行い計 32 個の Figure が生成される。

元の信号、4 倍にアップサンプリングした信号、元の信号をフィルタ処理した信号は終了時にそれぞ

れ行列 y、y4、z、w に格納される。フィルタ処理は左チャンネルが高域通過、右チャンネルが低域通過

で、遮断周波数は filterout.mでは共にスイープの中心周波数(約 632Hz)、afilterout.mでは高

域通過が中心周波数の 1/6 倍、低域通過が 6 倍である。

「現在のフォルダー」に plotwave.m、plotspec.m、filterout.m、afilterout.m の 4 個を

置いて実行する(これらの関数が無い状態ではメッセージを表示して終了する)。図 13 の上段は

filterout.m、下段は afilterout.m で処理した信号で、左から全区間 250ms の波形、スイープ中

心周波数中心の 40ms の波形、全帯域(4Hz~22.05kHz)の対数軸表示の振幅スペクトルである。

図 13 filterout.m(上)と afilterout.m(下)による処理結果の波形とスペクトル

註 1:[オシロスコープ編]の事前準備で生成し使用した fast_sweep.wav と異なりオシロスコープト

リガー用の第 1 波のブーストは無い。この点は課題Ⅰ②で使用した sweep0dB.wav と同じであるが、図

13 上段左の 2 個の Figure が示す通り、filterout.mによる急峻な遮断処理では課題Ⅰ⑦の矩形波の

正弦波合成で見た不連続点の前後の様に遮断周波数付近の標本絶対値が元の信号の標本絶対値を超え

るので 0dBFSではなく-3dBFSとしている。

註 2:標本値の正負の不均衡が(位相を変化させて平均した場合)最大となる周波数で、波形(MATLAB

Page 24: オシロスコープと信号処理 信号処理編 テキストct13050/johogaku/2-2.signal...4 MATLAB 関数fftは正規化係数を1 としており、fftの結果から振幅を求めるには標本数N

24

で描画される波形は標本値を単純に折線でつないだもの)の表示では、この周波数付近で正負の何れか

の側(信号の極性による)に空隙ができる。ただし、MATLAB 関数 sound で聞く音は表示される y の

波形ではない。実際に DA 変換されて再生される波形のイメージとして MATLAB 関数 resampleで 4

倍の 176400Hz にアップサンプリングした信号 y4 を元の信号と併せて表示する(図 14)。興味のある

人はソース 33 行の resample(y,4,1)と 34 行の Fs*4の 4 を 2、8 等に変えてプロットして比較しな

さい。

註 3:信号の長さが僅か 250ms であるため、soundの引数の標本化周波数を 8192 に指定して「遅聞き」

しており(ソースの 29、41、48 行、)、本来の周波数よりも 2 オクターブと完全 4 度ばかり低くなる。

興味のある人は 18 行の T1 の値を(例えば 10 に)変えて sound(y,Fs);および sound(z,Fs);によ

り本来の標本化周波数での再生を試みなさい。

図 14 14700Hz 付近の高速スイープ信号とこれを 4 倍アップサンプリングした信号の比較

左右の標本値が同じであるため、図 14 では hold on;で後から描画される右チャンネルの赤で上書

きされ全て赤で表示される(MATLAB 互換のオープンソース Octave では左と右が共に同じ値で存在す

ることが分る表現になっている)。

(3)fft_ifft_test.m

「現在のフォルダー」にある音声ファイルを読込んで再生、波形表示、スペクトル表示を行い、離散

フーリエ変換・逆変換を行った復元信号の再生と波形表示を行った後、これを音声ファイルとして(元

のファイル名に’_r’を付けて)保存する(Figure は 8 個生成される)。実行時にファイル名と詳細波形

の表示区間の入力がプロンプトされる。「現在のフォルダー」に plotwave.m および plotspec.m を

置いて実行する(両関数が無い状態ではメッセージを表示して終了する)。

p.25 図 15 左はサンプル音声ファイル L_wn_1k_R_pink_440.wav を読込んで時間範囲を[0.1

0.11+i]に指定(信号長を 1 として 0.1~0.11 の区間の波形で、描画される軸とタイトルでは秒単位の

Page 25: オシロスコープと信号処理 信号処理編 テキストct13050/johogaku/2-2.signal...4 MATLAB 関数fftは正規化係数を1 としており、fftの結果から振幅を求めるには標本数N

25

数字を表示する)した波形で、図 15 右は実行終了後に変換前後のファイルを WaveCompare で比較し

て一致することを確認した結果である(註参照)。

註:wav ファイルにはヘッダと音声データ以外にファイルを生成するソフトウェアによりオプションで

付けられるチャンクがあり(MATLAB の audiowrite 関数では、旧関数の wavwrite には無かった

引数 ’Title’、’Artist’、’Comment’ が追加され、これらの引数と対になる文字列が INFO チャンクに

書き込まれる)このため音声標本が一致してもファイルとして一致するとは限らない。

したがって、音声データの一致を単純にバイナリエディタで確認することはできないが(例えば同梱

の narration_fs16k_16b_mono.wavとこれを fft_ifft_test.m で復元保存したファイルをバイ

ナリエディタで表示して確認しなさい)、実験課題で使用している WaveGene、WaveSpectra と同じく

efu さんの作になる WaveCompare では音声データ部分のみを比較することができる。

Wave ファイル専用 比較ソフト WaveCompare

http://efu.jp.net/soft/wc/wc.html

図 15 fft、ifft を施して保存したファイルの音声標本は完全に一致する

(4)fftfilt_test.m

音声信号とインパルス応答(IR)をそれぞれ格納した wav ファイル(「現在のフォルダー」に置かれ

たもの)をこの順で読込み、音声信号に IR の信号長だけの無音区間を追加して MATLAB 関数 fftfilt

を用いて両者を畳み込み、両者のファイル名を連結したファイル名で保存する。既定では音声信号と畳

み込んだ信号を再生するが、音声信号と IR のファイル名の最後にファイル名の文字として使えない’:’

を付けた場合にはそれぞれ音声信号、畳み込んだ信号の再生をしない。

音声信号と IR の標本化周波数が異なる場合、IR が音声信号の標本化周波数に合せてリサンプリング

される。指定したファイルが「現在のフォルダー」に存在しない場合(例えば⏎のみ入力した場合)、

音声信号では 441Hz(標本化周波数の 1/100)40 周期の短音を 10 秒間に 20 回、IR では指数関数的に

減衰する 3 秒間の正規白色雑音を生成して処理する。何れも存在しない場合に保存されるファイルのフ

ァイル名は’441Hz_short_tone_decaying_randn.wav’となる。

p. 26 図 16 は既定で生成される音声信号と IR の波形、p. 26 図 17 は畳み込まれた結果の最後の 2 音

と残響部分の例(IR が乱数で生成されるため、IR と結果の波形は一例)である。

Page 26: オシロスコープと信号処理 信号処理編 テキストct13050/johogaku/2-2.signal...4 MATLAB 関数fftは正規化係数を1 としており、fftの結果から振幅を求めるには標本数N

26

図 16 既定で生成する音声信号(左)とインパルス応答(右)の波形

図 17 既定の音声信号とインパルス応答を畳み込んだ波形の例(区間は 9s-11.5s)

(5)LCR_test.m

課題Ⅰ②で行った高速スイープ信号の再生・録音によるフィルタ、共振回路の実験をシミュレートす

るもので、回路構成、左右チャンネルの測定対象を素子の記号(’L’、’C’、’R’の何れか。小文字でもよい

がこれ以外の文字は無視する)でそれぞれ回路入力のホット側からコールド側(不平衡の場合は GND)

の順で指定する。既定では回路は’LCR’、左チャンネルは回路全体、右チャンネルは回路入力のコール

ド側の素子である。課題Ⅰ②の 3~5 節の回路のシミュレーションでは、それぞれ「CR⏎⏎⏎」、「LR⏎

⏎⏎」、「⏎⏎⏎」と入力する。

測定対象の素子が回路中に存在しない場合は無視し、対象が空となる場合は左チャンネルでは回路の

ホット側の素子、右チャンネルではコールド側の素子とする。素子が空ではないが回路が’LCR’で測定

対象が’LR’の様に回路の配線とは合わない場合、左チャンネルでは入力中に存在する最初の素子、右チ

ャンネルでは最後の素子とする(例えばLCR直列共振回路でLRを指定した場合、左チャンネルではL、

右チャンネルでは R がそれぞれ対象となる。LR 両端の電圧が必要ならば回路を LRC または CLR と指

定する)。

p. 27 図 18~21 はそれぞれ LCR、CR、LR、LC 回路の応答で、左から補正無しの周波数応答、

+10dB/decade の補正をした振幅スペクトル、位相スペクトル(青が左チャンネル、赤が右チャンネル、

緑が右と左の差で、左右は各チャンネルのフーリエ係数の絶対値、差では両チャンネルのフーリエ係数

の絶対値共に閾値を超える要素以外は 0 としている)である。図 21 の様な LC 回路での L と C の同時

測定は課題Ⅰ②の構成では行えないが、平衡入力端子を備えたオーディオインタフェースがあれば可能

Page 27: オシロスコープと信号処理 信号処理編 テキストct13050/johogaku/2-2.signal...4 MATLAB 関数fftは正規化係数を1 としており、fftの結果から振幅を求めるには標本数N

27

である。出力インピーダンスと各素子の物理量を変更したい場合は、ソースの 11~15 行を修正する。

図 18 LCR 回路の補正無振幅応答(左)、補正振幅応答(中)、位相差(右)

図 19 CR 回路の補正無振幅応答(左)、補正振幅応答(中)、位相差(右)

図 20 LR 回路の補正無振幅応答(左)、補正振幅応答(中)、位相差(右)

図 21 LC 回路の補正無振幅応答(左)、補正振幅応答(中)、位相差(右)

Page 28: オシロスコープと信号処理 信号処理編 テキストct13050/johogaku/2-2.signal...4 MATLAB 関数fftは正規化係数を1 としており、fftの結果から振幅を求めるには標本数N

28

(6)mtlb_test.m

‘mæʈləb’と発音された MATLAB 組み込みの音声データ(p.18 参照)を読み込み、波形(図 22 上部)

と MATLAB 関数 spectrogram(第 2 ローテーション課題Ⅱ④でフォルマント周波数を求めるために

使用しているものと機能は同じ)によるスペクトログラム(図 22 下部)を表示する。spectrogram

の指定は Hamming 窓分析区間 64 標本、重なり 32 標本、256 点 FFT としており、スペクトログラム

の左右両端では 32 標本分の約 4.3ms が空白の表示となる。

図 22 mæʈləb の発音の波形とスペクトログラム

● サンプル音声ファイル

L_wn_1k_R_pink_440.wav

標本化周波数:44100Hz、標本数:441000(10 秒間)

左チャンネル:WaveGene による-10dB「ホワイトノイズ」と-10dB 1kHz「サイン波」の合成

右チャンネル:WaveGene による-6dB「ピンクノイズ」と-10dB 440Hz「サイン波」の合成

narration_fs16k_16b_mono.wav

標本化周波数:16000Hz、標本数:336043(約 21 秒間)

課題Ⅱ④のテキストの説明図で使用している民放連テスト音声を Wavesurfer 用に標本化周波数とチ

ャンネル数を変換したもの