ミスチルの大名曲の数々が配信決定!! 31日間無料!!【PR】

私は時間と電圧の値に対して以下の処理を施しています。

時間と電圧の波形(時間波形と呼ぶ。)にフーリエ変換

バンドパスフィルタ

逆フーリエ変換


この処理をした後に、時間の初めの部分に元の時間波形より大きな値が出てしまいます。
逆フーリエ変換後に初めの時間に大きな値が発生してしまう原因をご存知の方いましたら、原因を教えてください。
よろしくお願いします。

なお、フーリエ変換→逆フーリエ変換で元の時間波形になることは確認しています。

このQ&Aに関連する最新のQ&A

A 回答 (5件)

 「原因」はバンドパスフィルタを通したから。

単にそれだけでしょう。バンドパスフィルタやハイパスフィルタによって元の信号よりもピークが大きくなるのは、ごく普通に生じることです。悩むような異常なことは何も起こっていないと思いますよ。
 なお、もし「オーバーシュートが出るのが嫌だ」というのがご質問の真意であるなら、フィルタを周波数空間で見て、ゲインが急激に変化する所がないように滑らかにしてやることです。
 ちなみに、「ギブスの現象」は全く別の話であり、本件には関係ないですね。
    • good
    • 0
この回答へのお礼

ありがとうございます。自分もそうである気はしているのですが、少し違うのではないかと考えてる部分もあります。もう少し考えてみます。

お礼日時:2011/04/24 02:02

やや極端な特性例ですが。



    ↓  参照URL

>図14はベッセルフィルタのステップ応答です。ベッセル特性のフィルタにはバターワースで生じたオーバシュートやリンギングがありません。

参考URL:http://www.orixrentec.jp/cgi/tmsite/knowledge/kn …
    • good
    • 0
この回答へのお礼

ありがとうございます。

お礼日時:2011/04/24 02:01

>図3-8に5次までの高調波、9次までの高調波、19次までの高調波、59次までの高調波で方形波を近似した波形を示します。



  ↓ >ギブス現象をなくすにはどうしたらいいのですか?

引用ページでわかるように、フィルタの帯域幅を広げれば、Gibbs 現象の振れ幅は減ります。

帯域幅を広げたくなければ、遮断特性のロールオフ傾斜をゆるやかにします。
  
    • good
    • 0
この回答へのお礼

ありがとうございます。
アドバイスも参考にさせていただいているのですが、なかなかうまくいっていません。

お礼日時:2011/04/20 16:23

不連続なところでオーバーシュート/アンダーシュートが出てるなら Gibbs現象.

この回答への補足

バンドパスフィルタをかけた後だけギブス現象が生じるのはどうしてですか?

補足日時:2011/04/20 10:13
    • good
    • 0
この回答へのお礼

ありがとうございます。
不連続なところでオーバーシュート、アンダーシュートが発生しています。

ギブス現象をなくすにはどうしたらいいのですか?
わかる範囲で良いので教えていただけないでしょうか?

お礼日時:2011/04/20 09:00

「ギブス現象」じゃありませんか?


  ↓
 参考URL
   

参考URL:http://www.dbkids.co.jp/popimaging/seminar/fouri …
    • good
    • 0
この回答へのお礼

ありがとうございます。
不連続なところでオーバーシュート、アンダーシュートが発生しています。

ギブス現象をなくすにはどうしたらいいのですか?
わかる範囲で良いので教えていただけないでしょうか?

お礼日時:2011/04/20 09:00

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q原波形のノイズ除去方法(FFT、逆FFT)

始めに、僕は数値解析等にはかなりの未熟者です。
今、微量な電流を拾ってそれを200倍に増幅した原波形があるのですが、それには多くのノイズがはいってしまい見にくいんです。それでそのノイズを除去したいのです。
今考えているのはFFTをかけてでてきた周波数を逆FFTを行いノイズを除去しようと考えています。もし他に簡単にノイズを除去できる方法があれば教えていただきたいのですが。
今、自分のなりの考えで行うとしてもその処理の仕方がまったくわかりません。どのソフトを使うのが最適なのかがわかりません。こういう場合で使いやすいソフトってありますか?

わかりにくい説明ではありますが、分かる人がいましたらアドバイスください。

Aベストアンサー

No.2です。

画面全体がノイズだらけになるとしたらデータの処理だけで
ノイズを除去する事は難しいかもしれません。
データの再取得が可能であるならば再取得してください。
その際、あらかじめアナログ回路部分でノイズを除去しておいてデータを取得するようにしてください。
データのサンプリング時にエイリアシングが発生して信号にかぶさった場合には後処理でノイズを除去する事は不可能です。


フィルタについてはアナログ回路で実現するもの、AD変換後にデジタル回路で実現するもの、データ取得後にソフトウエアで行うものなどが有ります。

>多少信号のでている時間、大きさに誤差が出てきてしまう
とのことですが、フィルタを通した場合一般的には時間遅れが生じます。
どれだけ遅れるかはフィルタが決まれば決定されるのでその分補正すれば良いです。
大きさについては適切に設計されていれば大きくずれる事はありませんが
フィルタの種類によっては通過域でゲインが変化しないものと多少の変化があるものとが有るので用途によって使い分けします。

フィルタ処理の具体例を挙げます。
No.3さんの計算と同じものです。
/* FIRフィルタのサンプル */
#define DATA_SZ1000 /* データの個数 */
#define KN2
#define KEISU_SZ(2*KN+1) /* フィルタの係数の個数 */

float input[DATA_SZ]; /* 入力データ 適当な方法で初期化すること */
float output[DATA_SZ]; /* 出力データ */
float keisu[KEISU_SZ] = {1.0/KEISU_SZ} ; /* 移動平均フィルタの場合 */

void fir( float *in, float *out, float *ks ){
int i,j ;
float x;

  for( i=KN ; i<DATA_SZ-KN ; i++ )
    {
      x= 0 ;
      for( j=-KN : j<=KN ; j++ )
      {
         x += in[i+j] * ks[j+KN] ;
      }
      out[i] = x ;
   }
} /* インデントを付けるため全角スペースを使用しています */

もっと具体的には
入力データ d0,d1,d2,d3,d4,d5,d6,d7
係数データ k0,k1,k2,k3,k4
出力データ ______x2______  上下をそれぞれ掛け算したものの合計
x2 = ( d0*k0 + d1*k1 + d2*k2 + d3*k3 + d4*k4 )

出力のx3を求める場合は入力データを1個左にシフトします。
入力データ d1,d2,d3,d4,d5,d6,d7
係数データ k0,k1,k2,k3,k4
出力データ ______x3______ 
x3 = ( d1*k0 + d2*k1 + d3*k2 + d4*k3 + d5*k4 )

これから分かるように x0,x1 を求めるにはデータが足りません。
どこかから(例えばd0で置き換える)データを持ってくるか、無いものとするしかありません。

係数の数を増やせばより高性能なフィルタとすることが出来ます。
係数を決める、つまりはフィルタを設計する方法の説明はここでは難しいです。
次数がそれほど大きくなけれはエクセルでも計算できます。

No.2です。

画面全体がノイズだらけになるとしたらデータの処理だけで
ノイズを除去する事は難しいかもしれません。
データの再取得が可能であるならば再取得してください。
その際、あらかじめアナログ回路部分でノイズを除去しておいてデータを取得するようにしてください。
データのサンプリング時にエイリアシングが発生して信号にかぶさった場合には後処理でノイズを除去する事は不可能です。


フィルタについてはアナログ回路で実現するもの、AD変換後にデジタル回路で実現するもの、データ取得...続きを読む

Qフーリエ変換・逆変換の虚数成分って?

フーリエ変換を用いた論文を読んでいるときに、ある3次元関数f(x,y,z)に対してフーリエ変換・逆変換を行ったとき、逆変換で求められる値は実数成分と虚数成分があり、虚数成分を無視できるという記述を見つけました。
これは対象の関数が実数成分しかもともと持ち合わせていなかったで逆変換しても虚数はゼロである、という解釈でいいのでしょうか?

正直、フーリエ変換・逆変換に関してはほとんど初心者なのですが、気になってしまっています。誰かこの疑問に答えていただけないでしょうか?

Aベストアンサー

1次元と3次元の本質的な違いは無いので1次元で考えればよい。
以下jは電気工学の記法を採用し虚数単位とする。
sin(2πξt)≡(exp(j2πξt)-exp(-j2πξt))/2/j
をフーリエ変換すると
(δ(f-ξ)-δ(f+ξ))/(2j)
となる。
これは実部0で虚部が(δ(f-ξ)-δ(f+ξ))/2であるから
虚部を0とすると逆変換も0となり大変なことになる。
つまりその論文で説明をしている著者は
フーリエ変換について不勉強ということである。
その論文は捨ててまともな論文を勉強するべきということになる。

QC言語プログラミングについて(回文、palindrome)

palindrome(回文:始めから(通常通り)読んでも、終わりから(通常と逆に)読んでも同じ読み方をする分列)を判断するプログラムを作成したいのですが
条件が...
Input : 英語のアルファベットもしくは数字から成り立っているstring
(ただし、大文字小文字の区別はしなくても良い)
必ず stackを 利用して作成。 (連結リストを使う)
abba -> palindrome
Aba -> palindrome
Abcd123 -> not palindrome

Output : 入力された stringが palindromeなのか判別してその結果を出力する。

なのですが、プログラミングが得意な方どなたかご教授お願いします><

Aベストアンサー

以下のようにしてください。
sample1.c
-------------------------------------------
#include <stdio.h>
#include <string.h>
int main(void)
{
char buff[4096];
int i;
int len;
int hantei = 1;
printf("Input data=>");
gets(buff);
len = strlen(buff);
//先頭から順に1文字ずつ取り出し、比較する文字をおしりから1文字ずつ取り出す
for (i = 0; i < len;i++){
//文字が不一致なら回文でない(大文字小文字は無視するため大文字にして比較する)
if (toupper(buff[i]) != toupper(buff[len-i-1])){
hantei = 0;
break;
}
}
if (hantei == 1){
printf("palindrome\n");
}else{
printf("not palindrome\n");
}
return 0;
}
---------------------------------------------------------------------

sample2.c
------------------------------------------
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
typedef struct data {
char item;
struct data *next;
struct data *back;
} DATA;
//開始ポインター
DATA start;

//最後のデータを取得する
DATA *get_last_data( void )
{
DATA *p = &start;
while(p->next != NULL){
p = p->next;
}
return p;
}
//リストの最後へデータを登録する
void push_data(char item)
{
DATA *last;
DATA *p = malloc(sizeof(DATA));
if (p == NULL){
printf("malloc error\n");
exit(10);
}
//最後のデータ取得
last = get_last_data();
//nextの付け替え
last->next = p;
//最後のデータ登録
p->item = item;
p->next = NULL;
p->back = last;
}
//リストの最後からデータを取り出す
char pop_data( void )
{
char item;
DATA *last;
DATA *prev;
last = get_last_data();
item = last->item;
//1つ前のデータのnextをNULLに設定
prev = last->back;
prev->next = NULL;
//最後のデータを解放
free(last);
return item;
}
int main(void)
{
char buff[4096];
int i;
int len;
char item;
int hantei = 1;
//リストの開始設定
start.next = NULL;
start.back = NULL;
start.item = 0x00;
printf("Input data=>");
gets(buff);
len = strlen(buff);
//先頭から1文字ずつスタックに登録
for (i = 0; i < len;i++){
push_data(buff[i]);
}
//先頭から順に1文字ずつ取り出し、比較する文字をスタックから1文字ずつ取り出す
for (i = 0; i < len;i++){
item = pop_data();
//文字が不一致なら回文でない(大文字小文字は無視するため大文字にして比較する)
if ( toupper(buff[i]) != toupper(item) ){
hantei = 0;
break;
}
}
if (hantei == 1){
printf("palindrome\n");
}else{
printf("not palindrome\n");
}
return 0;
}
-------------------------------------------

sample3.c
-------------------------------------------
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
typedef struct data {
char item;
struct data *next;
} DATA;
//開始ポインター
DATA start;

//最後のデータを取得する
DATA *get_last_data( void )
{
DATA *p = &start;
return p->next;
}
//リストの最後へデータを登録する
void push_data(char item)
{
DATA *last;
DATA *p = malloc(sizeof(DATA));
if (p == NULL){
printf("malloc error\n");
exit(10);
}
//最後のデータ取得
last = get_last_data();
//最後のデータの付け替え
start.next = p;
//最後のデータ登録
p->item = item;
p->next = last;
}
//リストの最後からデータを取り出す
char pop_data( void )
{
char item;
DATA *last;
DATA *prev;
last = get_last_data();
item = last->item;
//最後のデータの付け替え
start.next = last->next;
//最後のデータを解放
free(last);
return item;
}
int main(void)
{
char buff[4096];
int i;
int len;
char item;
int hantei = 1;
//リストの開始設定
start.next = NULL;
start.item = 0x00;
printf("Input data=>");
gets(buff);
len = strlen(buff);
//先頭から1文字ずつスタックに登録
for (i = 0; i < len;i++){
push_data(buff[i]);
}
//先頭から順に1文字ずつ取り出し、比較する文字をスタックから1文字ずつ取り出す
for (i = 0; i < len;i++){
item = pop_data();
//文字が不一致なら回文でない(大文字小文字は無視するため大文字にして比較する)
if ( toupper(buff[i]) != toupper(item) ){
hantei = 0;
break;
}
}
if (hantei == 1){
printf("palindrome\n");
}else{
printf("not palindrome\n");
}
return 0;
}
-------------------------------------------------

sample1.cはリストを使わない方法です。
非常にすっきりしていますが、リストを使うことが今回の前提なので、参考程度にしてください。
(回文の判定でリストを使うことがいかに無意味かを知るにはよい材料になるかと)

sample2.cは双方向(next,back)のリストを使っています。双方向のリストを使うことが主な目的なら
この方法になりますが、冗長的です。

sample3.cは単方向(nextのみ)で、かつスタックとして使用することに特化しています。
単方向(nextのみ)で、かつスタックとして使うことが前提ならこの方法になります。
尚、sample2はデータ件数(=入力文字数)が非常に多くなると(約1万件以上)、劇的に遅くなります。
画面から入力する文字数は100桁程度で十分なので、その範囲で使用するには問題ありません。

3つのプログラムは、すべて同じ結果になります。
以下、実行例です。
Input data=>abBa
palindrome

Input data=>abcdegsd3457
not palindrome

以下のようにしてください。
sample1.c
-------------------------------------------
#include <stdio.h>
#include <string.h>
int main(void)
{
char buff[4096];
int i;
int len;
int hantei = 1;
printf("Input data=>");
gets(buff);
len = strlen(buff);
//先頭から順に1文字ずつ取り出し、比較する文字をおしりから1文字ずつ取り出す
for (i = 0; i < len;i++){
//文字が不一致なら回文でない(大文字小文字は無視するため大文字にして比較する)
if (toupper(buff[i]) != toupper(buff...続きを読む

QCTRL+Dでループを抜けるには

RedHatLinux7J環境でC言語のプログラミングを行っています。キーボードからCTRL+D(EOF)が入力されるまで、1文字入力しその文字コードを出力するプログラムです。
しかし、CTRL+Dを2回押さないと処理が終わりません。
これはなぜなのでしょうか。ご存知の方いらっしゃいましたらお願いいたします。

#include<stdio.h>
main(){
int ch;

while((c=getchar())!=EOF)
printf("%d ",ch);

putchar('\n');
}

Aベストアンサー

最初は「そんなことないだろう」と思ってたんですが,確かに入力行の途中でCtrl+Dを押したときは,リターンを押したときのようにそこまでの入力内容がフラッシュされるだけで,EOFにはならないですね.
[a],[b],[c],[Ctrl+D]と押した場合
 → abc97 98 99
私も知らなかったんですが,どうも行頭で押さないとCtrl+DはEOFにならないようです.
キーボードバッファリングの仕様がこうなってるからどうしようも無いと諦めるか,あるいはバッファリングをせずに直で1文字ずつ取るか,どっちかですね.
バッファリングをしないでキーボードから直接文字を取るにはcursesライブラリを使うのが簡単だと思います.

#include <stdio.h>
#include <curses.h>

main()
{
int ch ;

initscr();

while ( ( ch = getch() ) != 4 ){
printf("%d ",ch);
refresh();
}

printf("\n");
endwin();
}

4がCtrl+Dを表す文字コードです.initscr, getch, refresh, endwinがcursesのライブラリ関数です.

コンパイルのときはcursesライブラリをリンクするのを忘れないで下さい.gccの場合↓
gcc test.c -o test -lcurses

最初は「そんなことないだろう」と思ってたんですが,確かに入力行の途中でCtrl+Dを押したときは,リターンを押したときのようにそこまでの入力内容がフラッシュされるだけで,EOFにはならないですね.
[a],[b],[c],[Ctrl+D]と押した場合
 → abc97 98 99
私も知らなかったんですが,どうも行頭で押さないとCtrl+DはEOFにならないようです.
キーボードバッファリングの仕様がこうなってるからどうしようも無いと諦めるか,あるいはバッファリングをせずに直で1文字ずつ取るか,どっちかですね.
バッフ...続きを読む

Qポインタを使って回文かどうかチェックしたい

タイトルの通り、ポインタを使って
回文(前から読んでも後ろから読んでも同じってやつです)
であるかどうか判断するプログラムを
作りたいのですが、
どうしてもうまく行きません。どうしたらいいでしょうか。

今の所こんな感じです
#include <stdio.h>

int main(void)
{
char string[256];
char *checkA, *checkB;

printf("Input String >> ");
scanf("%s", string);

for(checkA = string; *checkA != '\0'; checkA++){
;
}

checkB = string;
for(checkA = checkA - 1; checkA <= 0; checkA--){
*checkB = *checkA;
checkB++;
}

if(*checkA == *checkB){
printf("%s は左右対称です。\n", string);
}
else{
printf("%s は左右対称ではありません。\n", string);
}
return 0;
}

タイトルの通り、ポインタを使って
回文(前から読んでも後ろから読んでも同じってやつです)
であるかどうか判断するプログラムを
作りたいのですが、
どうしてもうまく行きません。どうしたらいいでしょうか。

今の所こんな感じです
#include <stdio.h>

int main(void)
{
char string[256];
char *checkA, *checkB;

printf("Input String >> ");
scanf("%s", string);

for(checkA = string; *checkA != '\0'; checkA++){
;
}

checkB = string;
for(checkA = checkA - 1; checkA <= 0; ...続きを読む

Aベストアンサー

おはようございます.

終了処理が怪しい為に一寸危険な感じになってますね.
ここでは,以下の方針を使います.
(1)文字列の長さの取得はstrlen()を使う
(2)ヌル文字での終端を保証するためにfgets()を使う
(3)前から走査するポインタと逆に走査するポインタで一文字づつ比較.
実装例として以下のような感じでどうでしょうか.
この場合,長さが奇数なら「真ん中の文字」を同時に参照した段階で止まります.
長さが偶数なら「となり同士の文字」で止まります.
参考までに.

#include <stdio.h>
#include <string.h>

#define MAX_STR 256
int main(void)
{
char string[MAX_STR];
char *checkA, *checkB;
int len, isanag;

printf("Input String >> ");
fgets(string, MAX_STR, stdin); /* scanfは安全じゃない */

len = strlen(string); /* 長さを取得 */

/* 文字列の長さが奇数なら自動的に終了する */
/* checkAは先頭から,checkBは最後尾から始める */
for(checkA = string, checkB = string + (len - 1), isanag=1;
(checkA !=checkB); checkA++, checkB--){

if(*checkB != *checkA){
isanag = 0;
break; /* 途中一文字でも違ったら終了 */
}
if((checkA+1)==checkB){
break; /* 文字列の長さが偶数の時の終了処理 */
}
}
if(isanag){
printf("%s は左右対称です。", string);
}
else{
printf("%s は左右対称ではありません。\n", string);
}
return 0;
}

おはようございます.

終了処理が怪しい為に一寸危険な感じになってますね.
ここでは,以下の方針を使います.
(1)文字列の長さの取得はstrlen()を使う
(2)ヌル文字での終端を保証するためにfgets()を使う
(3)前から走査するポインタと逆に走査するポインタで一文字づつ比較.
実装例として以下のような感じでどうでしょうか.
この場合,長さが奇数なら「真ん中の文字」を同時に参照した段階で止まります.
長さが偶数なら「となり同士の文字」で止まります.
参考までに.

#include <stdio.h>
#...続きを読む

QCDのサンプリング周波数44.1kHzはどう決めた

CDのサンプリング周波数44.1kHzは、どのような経緯で決まったのでしょうか?
PCの世界は2進数が多いので、44,100Hzという中途半端な数値に決まったのはなぜか気になります。

Aベストアンサー

いろんな説がありますが、私の知っているのを一つ挙げます。

CDが出てくるちょっと前の話です。
デジタル音楽(PCM)というものが世の中に出始めたのは'70年代ですが
この時、サンプリング周波数をいくつにすべきなのかは、
人の聴覚的な感覚に左右されるので、工学的や数学的には決められませんでした。

欧州ではサウンドマイスターなどがブラインドテストなどを通じて32kHzを主張していました。
そしてとりあえずこの値を叩き台としました。
さて、実際にアナログ音をA/Dコンバータにかけデジタルデータを作成したとして
何に記録したらよいでしょう。

当時それほどの高密度データ記録を行え、かつ容易に入手可能な機械の代表は
ヘリカルスキャンを採用したビデオデッキでした(高価でしたが)
そこでソニーは自社製のUマチックに記録する事にしたのです。
Uマチックとは'70年頃に登場したソニーのビデオテープレコーダです。

このUマチックに、映像の代わりにデジタルデータを記録するのですが
ご存知の通り、ビデオデッキはリニアに記録しているのではなく
磁気テープ上に、細い線状の領域を斜めに数多く並べ、
1本の細い線に1フレーム(1画面)のデータを記録しています。
従って、この細い線が物理的に記録する最小単位になります。

では、この細い1フレーム分を記録する領域に、
何サンプルのデジタル音楽データが記録出来るのでしょうか?
ビデオデッキの水平周波数は15750Hz(30*525)です。
ヘリカルスキャンは回転ヘッドの切り替えタイミングが垂直同期信号付近にあるので
安定動作のため、適当なマージンをとってこの部分に記録するのを避けています。
数値的には垂直ブランキング付近の上下を総数35本を避けています。
35本にしたのは、(525/15)で割り切れる数だったからそうです。
つまり全体の1/15をマージンとしていたという事で
525-35=490ラインにデジタルデータが記録出来る事になります。
細い1フレーム分を記録する領域に
1サンプルを記録すると仮定すると(490/525)*15750*1=14700
2サンプルを記録すると仮定すると(490/525)*15750*2=29400
となり、2サンプル以下では欧州の要求した32kHzを下回ります。
そこで3サンプルを記録する事にして(490/525)*15750*3=44100
から44.1kHzが生まれました。
そしてそのサンプリング周波数を採用したPCMレコーダが、
記録手段としてビデオデッキを流用する事を前提に
アタッチメントという形で発売されました。

ちなみに同時期に日本コロンビアが発売したPCMレコーダは、
上記のマージン領域も全て記録用にしていまししたので
(525/525)*15750*3=47250
という、これまた中途半端なサンプリング周波数になっています。
ソニー=44100Hz、日本コロンビア=47250Hz ですね。
ソニーは44100Hzのデコーダを量産しましたので、提唱したCDの規格もそのようにしました。

もし仮にCD規格が日本コロンビアから出ていたとしたら、CDのサンプリング周波数は
47.25kHzになっていたかもしれませんね。

その後、DATの時代になり、当時32kHzを主張していた欧州に配慮して
48kHz/32kHzを策定しました。48kHzは32kHzからの変換が容易なためです。

余談ですが、もう一つの代表的な中途半端規格数である
カラーTVの29.97frameですが、途中を省略しますが
4500000/286/525=29.97・・・
からきています。

いろんな説がありますが、私の知っているのを一つ挙げます。

CDが出てくるちょっと前の話です。
デジタル音楽(PCM)というものが世の中に出始めたのは'70年代ですが
この時、サンプリング周波数をいくつにすべきなのかは、
人の聴覚的な感覚に左右されるので、工学的や数学的には決められませんでした。

欧州ではサウンドマイスターなどがブラインドテストなどを通じて32kHzを主張していました。
そしてとりあえずこの値を叩き台としました。
さて、実際にアナログ音をA/Dコンバータにかけデジタルデータを作成...続きを読む

QEXCELにてローパスフィルタを作成する

実験の測定データをEXCELでデータ整理しようと考えております。データ整理のためローパスフィルタをかけたいのですが、具体的にどういった式、もしくはEXCELの機能を使用したらいいのでしょうか?デジタルフィルタが良く分からないのでよろしくお願いします。
ちなみにローパスフィルタは1000Hzをかけたいです。

Aベストアンサー

時系列データの処理ならば

OutputData(n+1) = OutputData(n) + (InputData(n+1) - OutputData(n)) * dt / T

dt:データのサンプリング間隔
T:フィルタの時定数 1/2πf
f:カットオフ周波数
n,n+1:それぞれn個目,n+1個目のデータをしめす。

でいけると思いますが、一次のパッシブなんで効果が薄いかも。(普通はベッセルかけるんでしょうけど、そこまではわからない)

Qエクセルでノイズ値を除去する方法。

エクセルでノイズ値を除去できませんか。
ノイズ値除去をしたく、ネットで調べるとフーリエ変換という言葉が出てきます。
しかし、今一よくわかりません。
具体的には、
「2、5、7、5、8、21、6、10」という8個の数値があった場合に、
「21」をノイズ値として除去したいです。
実際にできるのでしょうか。
やり方を教えてください。宜しくお願いします。

Aベストアンサー

#1です.

3σの外を切るような乱暴な方法とか,
はたまた,外れ値は自動的には除去できないとか,無責任な回答があったので,
修正しておきます.

私は,「ノイズを除去しても欠測値にはしない」という立場で書いてきましたが,
除去でよいのなら,次のような取り除き方があります.

まずベースラインを補正します.
これは例えば,小学生の身長のように,学年に比例する観測値なら
学年に比例する分を取り除き,一定信号に基準化する作業です.

次に全体のヒストグラムを作ります.
これが,フーリエ変換のような作業だと考えて下さい.

運よく二山になったら,山の隙間のどこかに閾値(しきい値)をとって,上側の山を切り落とします.
これはローパスフィルタのような作業です.

二山にならず,肩のこぶのようになっていたら,
ここから先はエクセルでは無理かと思いますが,
ガウス分布やガンマ分布をあてはめて,二山をフィットします.
次にそれらの関数を使って,閾値を決めます.
閾値は,第1種の過誤(α)と第2種の過誤(β)が同じになるように決め,
原信号の犠牲比率とノイズの混入比率を同等にします.
次に,閾値から上側を切り落とします.

このように,ノイズの除去には原信号の犠牲が伴い,
それに対する配慮が必要であることを分かって頂けたと思います.
3σの外を切るような乱暴な話ではありません.

#1です.

3σの外を切るような乱暴な方法とか,
はたまた,外れ値は自動的には除去できないとか,無責任な回答があったので,
修正しておきます.

私は,「ノイズを除去しても欠測値にはしない」という立場で書いてきましたが,
除去でよいのなら,次のような取り除き方があります.

まずベースラインを補正します.
これは例えば,小学生の身長のように,学年に比例する観測値なら
学年に比例する分を取り除き,一定信号に基準化する作業です.

次に全体のヒストグラムを作ります.
これが,フーリエ変換のよ...続きを読む


人気Q&Aランキング