(* 拡張解析信号 *)
(* created at 2011/12/25 *)

(* 離散ユニットステップフィルタ *)
step[n_Integer?Positive]:=1+Sign[Sin[π Range[1,-1,-2/n]//Most]]
(* 実関数の複素化 *)
wind[li_List]:=InverseFourier[Fourier[li,FourierParameters->{1,-1}]*step[Length[li]],FourierParameters->{1,-1}]
repeat[li_,len_]:=PadRight[{},len,li]
(* liを補充して長さをlenにする *)
repeat[li_,len_]:=PadRight[{},len,li]
(* 0からスタートし、終点の値を始点の値にする *)
periodiclistlineplot[li_]:=ListLinePlot[{Range[0,Length[li]],Append[#,First[#]]&[li]}\[Transpose],Axes->None,PlotStyle->{Black,Thickness[0.005]}]
(* 複素平面のプロット、始点と終点を繋げる *)
complexlistlineplot[li_]:=ListLinePlot[Append[#,First[#]]&[{Im[#],Re[#]}&/@li],AspectRatio->Automatic,Axes->None,PlotStyle->{Black,Thickness[0.005]}]
swap[li_List,x_↔y_]:=ReplacePart[li,{x->li[[y]],y->li[[x]]}]
swap[li_List,pairs:{(_↔_)...}]:=Fold[swap,li,pairs]
extendedStep[n_,{x___,0,y___}]:=extendedStep[n,{x,y}]
extendedStep[n_,swapList_List]:=swap[step[n],#+1↔n-#+1&/@swapList]
extendedWind[li_List]:=wind[li]
extendedWind[li_List,swapList_List]:=InverseFourier[Fourier[li,FourierParameters->{1,-1}]*extendedStep[Length[li],swapList],FourierParameters->{1,-1}]

wavname="023";
wavfile=Import[ wavname<>".wav"];
li=wavfile//First//First//First;
rate=SampleRate->(wavfile//First//Last)
len=li//Length
compli=wind[li];
swapList=Range[5000,10000];
extendedCompli=extendedWind[li,swapList];
ListPlot[Im@Fourier[Im@InverseFourier[extendedStep[len,swapList],FourierParameters->{1,-1}],FourierParameters->{1,-1}],PlotRange->All](* 拡張したフィルタ *)

spectrumPlot[li_]:=ListLinePlot[Fourier[li,FourierParameters->{1,-1}]//Abs,PlotRange->All]

spectrumPlot[compli]

spectrumPlot[Re[compli]]

spectrumPlot[Im[compli]]

spectrumPlot[Re[(E^(I (π/4)))compli]]

spectrumPlot[extendedCompli]

spectrumPlot[Re[extendedCompli]]

spectrumPlot[Im[extendedCompli]]

spectrumPlot[Re[(E^(I (π/4)))extendedCompli]]

ListLinePlot[li]

mainRange={20000,20168};

periodiclistlineplot[Re[Take[compli,mainRange]]]
complexlistlineplot[Take[compli,mainRange]]
periodiclistlineplot[Re[Take[extendedCompli,mainRange]]]
complexlistlineplot[Take[extendedCompli,mainRange]]