ある波形に対してフーリエ変換(FFT)を行いました。
フーリエ変換後の波形に対して逆フーリエ変換(IFFT)を行いました。
すると、元通りの波形になりました。

しかし、FFTを行った後にバンドパスフィルタをかまし、逆フーリエ変換を行うと、最初の時間において大きな値を得るようなギブス現象のような現象が発生しました。

フィルタをかけたことでギブス現象が発生することはあるのでしょうか?
また、ギブス現象が発生した原因はフィルタにどのような問題があったと考えられますか?

重複質問になってしまい、申し訳ございません。
ご存知の方がいましたら教えていただけないでしょうか?

よろしくお願いいたします。

A 回答 (1件)

あちこち彷徨わずに、もとのご質問を続けたほうが、脱線を予防できますよ。


  
    • good
    • 0
この回答へのお礼

すみません。ではこちらを削除しておきます

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

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

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

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

Qフィルタ処理後の逆フーリエ変換で問題??

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

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

バンドパスフィルタ

逆フーリエ変換


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

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

Aベストアンサー

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

Qエクセルでセル内に斜線を引くには

Excel97です。表を作成し、いくつかのセル内で斜線を引きたいのですが、どういう操作をしたらいいですか、ご教示ください。

Aベストアンサー

下記のURLを参照してください。
写真いりでわかりやすくなっています。

参考URL:http://www.excel-jiten.net/cell_format/ruled_line_change_slash.html

QIIRフィルタとFIRフィルタ

無限インパルス応答(IIR)フィルタと有限インパルス応答(FIR)フィルタとはアナログでいう、バンドパスフィルタやローパスフィルタ、ハイパスフィルタのデジタル版みたいなものであることは分かるのですが、
無限、有限というのは何を表しているのでしょうか?
Wikipediaなどに解説はしてあるのですが、どうしても理解することが出来ません。
どなたか易しく説明して頂けないでしょうか?

Aベストアンサー

> つまり、例えば、1秒間だけのパルスに対してフィルタをかける場合、

元の信号の長さは関係ありません。
フィルタの次数が「1秒分」だったら、
入力信号が1秒だろうと10秒だろうと0.1秒だろうと、

> FIRであればパルスが終わった1秒後には信号は完全になくなる
ということになります。ただし、次数が1秒のフィルタなら「1秒後以降は無くなっている」のは保証されますが、場合によっては1秒より短い時間で無くなる可能性もあります。それはフィルタのパラメータ次第。

> IIRでは、フィルタ自体がそのパルスの残像を出力し続け、永遠にそのパルスが出力される
そういう場合も「あり得る」のがIIRです。実際にそうなるかどうかはフィルタのパラメータ次第です。
(で、先ほどの回答にも書きましたが、IIRでも、実用上は、減衰してそのうち影響が無くなるようなパラメータを設定するのが普通です。)

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>
#...続きを読む

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...続きを読む


人気Q&Aランキング

おすすめ情報