ゼロを補ってサンプル数を増やす関数。filter()は平準化を行う。downsample()は間引きを行う。octaveのresample()は、フィルタによる先頭部分の余分をカットしてある。フィルタの係数列octaveのresample()は、目的がアップサンプリングかダウンサンプリングかにかかわらず、upsample()とdownsample()の両方を呼び出します。p>1であれば、qの値にかかわらず、upsample()とfilter()が機能します。例(48KHzから44.1KHzへの変換)では、fir1()を使って作っています。resample()では、fir1()を使っておらず、より長い数列が作られます。左図は、長さが異なるので、中央を揃えて描きました。upfirdn()の例では、以下のようにして算出しています。24*pで、最小が24(p=1)です。fir1()の2番目の引数が通過帯域の上限で、ナイキスト周波数に対する割合を与えます。48KHzから44.1KHzへの変換の場合、22050Hzが通過帯域の上限です。2)で、アップサンプリングした状態に対する割合で指定されています。resample()の場合は、概ね以下のようになっているようです。60この値から、係数列の長さを計算。11593係数列は、以下のように計算されます。決まることになります。R言語でoctaveのresample()をして見るとR言語のresample()と、octaveのresample()は、異なっています。R言語のresample()は、「resample」と打てば、スクリプトが表示されますし、短くて理解しやすいものです。octaveの方は、操作やスクリプトが良くわかっていないこともあって難解です。処理内容を類推して、R言語のスクリプトで表現して見ます。upsample(),downsample()がないので、seq()でインデクスを生成して代入することで代替しました。フィルタの出力の最初の方は、入力データと無関係な値になります。フィルタの段数分進んだところからが有効なデータになります。R言語のresample()は、これをそのまま出力しています。このことは、終端のデータも、フィルタに残って出力に反映していないことになります。octaveの方は、先頭をカットしてして、後端も押し出しているようです。後端を押し出すためにフィルタの段数以上のゼロをデータの後半に加えることにします。フィルタの係数列を長くする理由はわかりません。図は、1000Hzのサイン波のテスト結果です。48000Hzで10msサンプリングしたデータを入力にしています。このデータを青で書いています。このデータは、480個です。これを44100Hzでリサンプルする場合のサンプリングポイントが赤です。同じ10msで441個のデータになります。先頭の無効な部分をカット}mikeo_410@hotmail.com。