周波数スペクトルの位相の影響

2004/4/13 平野拓一（東京工業大学）
2004/4/13 Takuichi Hirano (Tokyo Institute of Technology)

Wave ファイルの読み込み

SetDirectory["f:/hira2/public_html/hobby/edu/sonic_wave/phase/fig_\
math_doc/math"]

<< Miscellaneous`Audio`;

WaveFormPiano = 
        ReadSoundfile["GrandPiano.wav", 
          PrintHeader -> True];

音を出して確認

ListPlay[WaveFormPiano, SampleRate -> 22050, 
      PlayRange -> {-2^16, 2^16}]

時間波形を描く

ListPlot[
      WaveFormPiano, 
PlotRange -> {-2^16, 
          2^16}, 
PlotJoined -> 
        True, 
PlotStyle -> {RGBColor[1, 0, 1], 
          AbsoluteThickness[2]}, 
Ticks -> 
        None, 
Frame -> 
        True, 
FrameTicks -> 
        None, 
FrameLabel -> {"Time", "Amplitude\
", "", ""}]

１周期を切り取る

[入力パラメータ]
smprate: wave ファイルのサンプリングレート
freq: 解析する音の周波数（うまく１周期を切り出すために指定）
n1: 切り出しを開始するリスト要素の開始番号

smprate = 22050;
freq = (27.5*(2^3))*((((2^((1/12)))))^3);
t = (1/freq);
n1 = 20000;
n = Floor[(t/1)*smprate]*1;
WaveFormPiano2 = 
        Table[WaveFormPiano[[i + n1]], {i, 1, 
            n}];
TimeWaveFormPiano = 
        Table[{i, WaveFormPiano[[i + n1]]}, {i, 1, 
            n}];
ListPlot[
      TimeWaveFormPiano, 
PlotJoined -> 
        True, 
PlotStyle -> {AbsoluteThickness[2], 
          RGBColor[1, 0, 0]}, 
PlotRange -> 
        All, 
Ticks -> 
        None, 
Frame -> 
        True, 
FrameTicks -> 
        None, 
FrameLabel -> {"Time", "Amplitude\
", "", ""}]

離散フーリエ変換してスペクトルを描く

<< Graphics`Graphics`;
FWaveFormPiano2 = 
        Fourier[WaveFormPiano2];
FWaveFormPiano2 = 
        Take[FWaveFormPiano2, {1, 
            Floor[Length[FWaveFormPiano2]/2]}];
\(\(BarChart[
        Abs[FWaveFormPiano2], 
PlotRange -> 
          All, 
Frame -> 
          True, 
FrameTicks -> {{}, {}, {}, {}}, 
FrameLabel -> {"Frequency", "Amplitude", "", ""}, 
BarStyle -> {RGBColor[1, 0, 
              1]}, 
BarEdgeStyle -> {}, 
BarGroupSpacing -> 0];\)\)
Arg2[z_] := 
        If[Abs[z] > (10^(-9)), Arg[z], 0];
Arg2[x_List] := Map[Arg2, x];
\(\(BarChart[
        Arg2[FWaveFormPiano2]*180\/π, 
PlotRange -> All, 
Frame -> 
          True, 
FrameTicks -> {{}, {}, {}, {}}, 
FrameLabel -> {"Frequency", "Phase (deg)", "", ""}, 
BarStyle -> {RGBColor[0, 1, 
              1]}, 
BarEdgeStyle -> {}, 
BarGroupSpacing -> 0];\)\)

切り出した１周期をいくつも並べて周期波形を作り、音を聴いてみる

freq = 440*((((2^((1/12)))))^3);
t = (1/freq)*1;
dur = 1.0;
n = Ceiling[dur/t];
WaveFormPiano3 = 
        Flatten[Table[
            WaveFormPiano2, {i, 1, n}]];
ListPlay[WaveFormPiano3, SampleRate -> 22050, 
        PlayRange -> {-2^16, 2^16}];