移動平均とローパスフィルタについて(matlab)

このQ&Aのポイント
  • 移動平均とは、一定の範囲のデータの平均値を計算する方法です。
  • ローパスフィルタは、高周波成分を除去し、低周波成分を通過させるフィルタです。
  • 移動平均プログラムと同様の結果が得られるようなローパスフィルタを設計する方法が知りたいです。
回答を見る
  • ベストアンサー

移動平均とローパスフィルタについて(matlab)

入力信号10Hz(サンプリング周波数1000Hz)に対して、 1周期分(100点)のデータを取り出して平均値を算出し、1サンプル移動して同様に100点のデータの平均値を算出する、というような移動平均のプログラムを書きました(下に載せました)。 この移動平均プログラムと同様の結果が得られるようなローパスフィルタを設計したいのですが、方法がよくわかりません。 ご存じの方、教えて頂けると幸いです。 宜しくお願いします。 以下、移動平均プログラムになります。 clear all fs = 1000; % サンプリング周波数 t = 1/fs:1/fs:3; f = 10; % 入力信号の周波数 y = sin(2*pi*f*t); % 入力信号の生成 M = round(fs/f); % 一周期分のサンプル数(10Hzの場合、100点) for i = 1:1:length(y)-M+1 y2(i) = mean(y(i:1:i-1+M)); % 移動平均 end plot(t(M:end),y2);

質問者が選んだベストアンサー

  • ベストアンサー
  • masudaya
  • ベストアンサー率47% (250/524)
回答No.4

ハードで実現する場合は,FPGAで行う場合シフトレジスタにためて,加算して,係数を掛ける格好になると思います. 100個の和になるので,そのまま加算する場合は桁上がりに注意が必要です.係数を掛けてから加算した方が良いかもしれません.添付のURLに4段の場合のVDHLが書かれていました.参考までに. 前の方もおっしゃっていましたが,100個の移動平均であれば,100個分の時間を待つ必要がありますので,その処理を入れておく必要があると思います.ご注意ください.

参考URL:
http://www.ie.u-ryukyu.ac.jp/~wada/cad05/avg/avg4.vhd

その他の回答 (3)

noname#221368
noname#221368
回答No.3

 まず100個で移動平均を取ると、100個の平均が0の周波数成分は全部消える訳ですよね?。100個で余りが出るものについては、少々端数が出ますが、そんなに大きくないでしょう。  そうすると概ね10Hzのハイカット(ローパス)と、そんなに変わらないのでは?。#2さんが妥当と思います。

mizore0623
質問者

補足

現在はプログラム上で行っていますが、今後ハードウェアで設計したいと考えています。そのため、常に過去100点分保持しておくような方法ではなく、フィルタのようにpoint by point でできる方法で実装したいと考えています。 簡単に変換することは可能でしょうか?

  • foobar
  • ベストアンサー率44% (1423/3185)
回答No.2

デジタルフィルタ(FIR)でしたら、そのまま、過去100点分のデータの平均を取る、で良いかと思います。 他の手法で、ですと、別途設計が必要になるかと思います。

mizore0623
質問者

補足

現在はプログラム上で行っていますが、今後ハードウェアで設計したいと考えています。そのため、常に過去100点分保持しておくような方法ではなく、フィルタのようにpoint by point でできる方法で実装したいと考えています。 簡単に変換することは可能でしょうか?

  • 178-tall
  • ベストアンサー率43% (762/1732)
回答No.1

ひとまず、参照 URL …   

参考URL:
http://www.heg.co.jp/dspnyuumon/dsp1-3.htm
mizore0623
質問者

補足

ありがとうございます!

関連するQ&A

  • MATLABについてお聞きしたいです。

    MATLABについてお聞きしたいです。 現在勉強しているのですが、プログラミング初心者なので…。 MATLABでwavファイルの書き込みについてです。 周波数1000Hz, 0.5秒,サンプリング周波数22050Hz の設定にしてwavファイルで保存したく… f=1000; > A=0.5; > Fs=22050; > wavwrite(MyFunc_2(1000,0.5,22050),'sin1000'); という設定にして、保存したのですが、録音時に流れた音と録音された音が違うのです。 ファンクションMファイルは… function y=MyFunc_2(f,A,Fs) %Fs=44100; d=1/Fs; t=0:d:2; %f=440; %A=0.1; y=A*sin(2*pi*f*t); wavplay(y,Fs) このような設定にしています。 問題解決への協力よろしくお願いします。

  • ローパスフィルタ

    今、ローパスフィルタを作っています。そこでわからないことがあります。サンプリング周波数と遮断周波数の差が大きくなるほどフィルタは機能しないのですか?今作っているのは、サンプリング周波数100Hz、遮断周波数1.1Hzの時は信号を通しているのに、サンプリング周波数500Hz、遮断周波数5.5Hzだと、ぜんぜん信号を通しません。

  • ローパスフィルタ

    デジタルフィルタでローパスフィルタを作っています。1.1Hzのノイズを取り出そうとして、サンプリング周波数100Hzで遮断周波数が1.1Hzとしたときフィルタをつくり、サンプリング周波数200Hzで遮断周波数が2.2Hzのフィルタを作ったとき、この二つのフィルタでそれぞれ1.1Hzのノイズを取り出そうとしたのですが、サンプリングが100Hzのときはほとんど取り出せたのですが、200Hzのときは、半分くらいしか取り出せませんでした。2.2Hzまで取り出せるはずなのに、わかる人いますか?

  • MATLABでの純音提示の時間制御

    MATLABで一定間隔をおいて純音を提示することを目指しています。 その際の時間制御に関して質問があります。 現在250msごとに純音提示と無音状態を反復するプログラムを作成しています。 ticとtocを用いて純音ー無音の1サイクルに要する時間を計測しますと,0.57-0.68secの間でばたついています。可能な限り1サイクルが0.50sec付近に落ち着くようにしたいのですがどのようにすればよいでしょうか? PCのスペックなどはいじることが困難なので,出来る限りプログラミングで対応したいと考えています。 よろしくおねがいいたします。 ・MATLABのバージョン:MATLABR2007b ・導入済みのツールボックス:psychotoolbox ・作成済みプログラム f=440;%ラ音 Fs=44100 ;%サンプリング周波数 T=0.25;  %信号の長さ t=0:1/Fs:T; %公差が1/Fsで0から1までの等差数列 y=sin(2*pi*f*t); t2=0:1/Fs:0.25 %公差が1/Fsで0から1までの等差数列 y2=sin(2*pi*0*t2); for t=1:4 ; sound(y2,Fs); sound(y,Fs); end;

  • アナログ情報のデジタル化の問題ですけど・・・

    信号に含まれる最高周波数が概ね300Hzだと推測できる場合のサンプリング時間とその時に必要なlow pass filterのカットオフ周期はどのようにすればよいかという問題です。 この場合、最高周波数が300Hzなのでサンプリング周波数fはその2倍以上でとればいいので、 f>2*300Hz=600Hz したがってサンプリング時間の条件f=1/⊿t>600 したがって、⊿t<1/600 とうことは分かりました。カットオフ周期はサンプリング周期の1/2以下とすると300Hzより大きいということでよろしいのでしょうか・・・?ちょっと単純すぎるような・・・どうなのでしょう><

  • サンプリング定理

    30Hzの正弦波をサンプリング周波数40HzのAD変換器で離散化したとき、その出力波の見かけの周波数はどのくらいになるのか? という問いに対して以下のように考えたのですが、正しいでしょうか? 自身があまりなくて。。 (ナイキスト周波数) = (サンプリング周波数)/2  = 20 よりも入力周波数が大きいので、出力波は見かけ上、入力波より低い周波数になる。 サンプリング間隔Δt= (サンプリング周期) = 1/20 なので、出力波の最大周波数は 1/Δt = 20 よって出力波の見かけ上の周波数は20Hz 別のやり方として、y=sin xを30周期分紙に書くなり印刷するなりして,横軸を40等分して各点の y=sin x のところに黒丸を打って その40個の黒丸がsin x の30周期の間に何周期あるようにみえるか数える→実際にためすと10Hz という2つのやり方を考えたのですが、どちらも正しい気がしてならないです。

  • matlabできる方教えてください

    matlab初心者です。 入力信号(sin波)に階段波形をかけるプログラムをかきたいのですが、うまくいきません。 以下は、私がかいたプログラムです。 わかる方がいらっしゃいましたら回答宜しくお願いします。 clear all;close all; fs= 250; t_l=[0 1]; t=t_l(1)+1/fs:1/fs:t_l(2); X = sin(2*pi*2*t); Y = sin(2*pi*10*t); Z = stairs(X).*Y; figure stairs(t,Z)

  • ナイキスト周波数(間隔) 標本化定理

    複数の本やサイトを用いてナイキスト周波数や標本化定理,サンプリング周波数について,学んでいるものです. しかし混乱しました. ナイキスト間隔とは,元の信号を再現出来る最高の間隔でこれ以上の間隔でサンプリング(標本化)すると折り返し歪が生じるというような間隔,逆に言うと,これより小さなサンプリング間隔でサンプリングすれば良いと本に書いてありました. また,ナイキスト間隔の逆数はナイキスト周波数であり, サンプリング間隔の逆数はサンプリング周波数であるので, サンプリング周波数はナイキスト周波数より大きければ良い,と書いてあるのですが,ここが分けわかりません. Example 周期T=2の波をサンプリング間隔Ts=0.5でサンプリングした場合 周期の周波数はf=0.5Hz,サンプリング周波数はfs=2Hz この時, ナイキスト周波数はfn=1Hz,ナイキスト間隔は Tn=1なのでしょうか? だとすると,ナイキスト周波数以上でサンプリングすればいいという記述はどういった意味なのでしょうか?  サンプリング定理によると,(ローパスフィルタなどを用いずに)折り返し歪を防ぐには, 常にナイキスト周波数の2倍以上の周波数が求められるのだから, サンプリング周波数はナイキスト周波数の2倍以上なら良いと書くべきではないでしょうか? しかし自分でも感じるのですが,この結論もまた謎です^^;

  • MATLABによるFFTと位相スペクトルについて

    純粋な正弦波信号 y=sin2πft ただし周波数f=500MHz をサンプリング周波数2.5GHz,サンプリング数128,256,512,1024の四パターンMATLABでFFTし、パワースペクトルと位相スペクトルを求めました。 結果、パワースペクトルは予想通り500MHzでピーク値をとったのですが、位相スペクトルは各サンプリング数ごとに全く違う値を取りました。 というわけで、 (1)理論上、正弦波の位相スペクトルはどのような値になるのか (2)なぜサンプリング数ごとに位相スペクトルの結果が大きく変わったのか この二点をご教授ください。よろしくおねがいします。

  • 離散フーリエ変換

    サンプリング周波数1000Hzとしてデータ数をnとすると、周波数はどうやってもとめることができるのでしょうか?サンプリング周波数は1秒間に取得するデータでですので、n/1000=t(時間)となって、f=1/tの公式に当てはめることで求めることはできますか? よろしくお願いします。