C言語で書かれているFFTやフーリエ変換のプログラムのあるお勧めのサイトがあればおしえていただけないでしょうか?

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

A 回答 (3件)

No1のepistemeさんが紹介してくださっているライブラリは、それなりに有名だと思うので、


検索すれば情報が得られると思います。

ちなみにライブラリ本体は、
http://www.fftw.org/

http://www.fftw.org/download.html
からダウンロードできます…。


参考:
http://www32.atwiki.jp/amaeda/

参考URL:http://www32.atwiki.jp/amaeda/
    • good
    • 0
この回答へのお礼

ありがとうございます。

お礼日時:2011/04/29 00:25

> わかる範囲で良いので教えていただけないでしょうか?



まず読んで。お願いだから。
    • good
    • 1
この回答へのお礼

わかりました。

お礼日時:2011/04/29 00:25

下記URL参照



参考URL:http://www.fftw.org/
    • good
    • 0
この回答へのお礼

ありがとうございます。
ここでFFTのプログラムはどちらにありますか?

また、それをどのように利用したら良いのですか?

わかる範囲で良いので教えていただけないでしょうか?
よろしくお願いします。

お礼日時:2011/04/27 08:18

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

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

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

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

QLISPのマクロと他の言語のマクロの違い

LISPのマクロは強力と言われていますが、他の言語の言うマクロとはどう違うのでしょうか?

Aベストアンサー

ここでいう「マクロ」は一言で言うと「プログラムを生成する機能」ですね。
例えばCのマクロを例に上げますと、
#define MAX(a, b) (a) > (b) ? (a) : (b)
というようなマクロを定義すると、後に
MAX(10, x)
と書いた際に
(10) > (x) ? (10) : (x)
というプログラムがコンパイル時に生成されます。

Cなどのマクロは、マクロ専用の文法があり、
マクロで書けるものにはある程度の制限が付きます。例えば、
「マクロの引数が定数の際に奇数か偶数かで『生成するプログラム』を変える」
などといった複雑なことはできません。

一方、Lispのマクロは、Lispそのもので書くことが可能で、
任意のプログラムをマクロとして書くことができます。
マクロの中で条件分岐やループなど、なんでも出来てしまいます。
これにより、コンパイル時にマクロの引数の型や値に応じて
生成するプログラムを変えることで最適化を行ったり、
新たな言語機能(と対応する文法)を追加するようなことが可能です。

例えば、昔のLispにはオブジェクト指向の機能がありませんでしたが、
マクロを使うことで、後からオブジェクト指向の機能を付け加えることができました。
また、Common Lispのオブジェクト指向の機能が独特で嫌いな人は、
マクロを使うことでJava風のオブジェクト指向の機能を追加するようなことも可能です。
極端な話、Lispの上で別の言語が作れてしまうわけです。

コンパイル時に任意のプログラムを実行できるという点では、
C++のテンプレートとも似ているといえますが、
C++のテンプレートはテンプレート専用の文法を用いる必要ある点がLispと異なります。
C++をそれなりに書ける人でも、テンプレートで任意のプログラムを書こうとすると、
かなりの苦労を強いられます。テンプレートの文法がC++の文法と異なるのが苦労する原因の一つです。
一方、Lispのマクロは、Lisp自身で書けるため、
Lispが書ける人なら誰にだって書けてしまうわけです。

以上がLispのマクロが強力と言われる要因(の一部)です。
実際に使われてみると色々と実感できると思いますよ。

ここでいう「マクロ」は一言で言うと「プログラムを生成する機能」ですね。
例えばCのマクロを例に上げますと、
#define MAX(a, b) (a) > (b) ? (a) : (b)
というようなマクロを定義すると、後に
MAX(10, x)
と書いた際に
(10) > (x) ? (10) : (x)
というプログラムがコンパイル時に生成されます。

Cなどのマクロは、マクロ専用の文法があり、
マクロで書けるものにはある程度の制限が付きます。例えば、
「マクロの引数が定数の際に奇数か偶数かで『生成するプログラム』を変える」
などといった複雑なことはで...続きを読む

Qフーリエ変換のC言語プログラムについて

正弦波(およびガウス性雑音)をフーリエ変換(離散)→逆フーリエ変換するというプログラムを組みました。正弦波をフーリエ変換すると実部は2回ピークがくるはずなのですが、すべて「0.000000」または「-0.000000」と表示されてしまいます。虚部は正常なようで実装の仕方もさほど違わないので、何が問題なのかわからずにいます。念のためコードはすべて載せますが、該当箇所は関数Fourierの
fp = fopen("reX.txt", "w");//書き込む
あたりです。問題点を教えていただけないでしょうか。お願いします。


//gauss.txt, sin.txt:発生させたガウス性雑音&正弦波
//reX, imX:フーリエ変換の実部と虚部
//re-1, im-1:逆フーリエ変換の実部と虚部

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>

#define PI3.14159265358979323846
#define N256

//n:長さ, w:角周波数, p:位相(phase), a:振幅
void SinCurve(int n, double w, double p, double a)
{
FILE *fp;
double x;
int t;

fp = fopen("sin.txt", "w");//書き込むので"w"
if(fp == NULL)
{
printf("file open error\n");
} else
{
for(t = 0; t < n; t++)
{
x = a * sin( w*(double)t + p );
fprintf(fp, "%f\n", x);
}
}

fclose(fp);
}

//n:長さ, s:分散, m:平均
void Gauss(int n, double s, double m)
{
FILE *fp;
double x, x1, x2, y1;
int t;

srand((unsigned) time(NULL));

fp = fopen("gauss.txt", "w");//書き込むので"w"
if(fp == NULL)
{
printf("file open error\n");
} else
{
for(t = 0; t < n; t++)
{
x1 = ( (double)rand() + 1.0 ) / ( (double)RAND_MAX + 2.0);
x2 = ( (double)rand() + 1.0 ) / ( (double)RAND_MAX + 2.0);
y1 = pow(-2.0*log(x1), 0.5) * cos(2.0*PI*x2);
y1 = s * y1 + m;
fprintf(fp, "%f\n", y1);
}
}

fclose(fp);
}

//ファイル名sのデータをフーリエ変換し、実部と虚部をreX, imXに保存
void Fourier(int num, char *s)
{

FILE *fp;
int k, n;
double largeX, x[N+100], t;

fp = fopen(s, "r"); //読み込み
if(fp == NULL)
{
printf("file open error\n");
} else
{
//printf("%s\n", s);
for(k = 0; k < num; k++)
{
fscanf(fp, "%lf", &x[k]);
printf("x[%d]=%f\n", k, x[k]);
}
}

fp = fopen("reX.txt", "w");//書き込む
if(fp == NULL)
{
printf("file open error\n");
} else
{
for(k = 0; k < num; k++)
{
largeX = 0.0;
t = 2.0*PI*(double)k / (double)N;
for(n = 0; n < num; n++)
{
largeX += x[n] * cos((double)n*t);
//printf("%f\n", largeX);
}
fprintf(fp, "%f\n", largeX);
printf("reX[%d]=%f\n", k, largeX);
}
}

fp = fopen("imX.txt", "w");//書き込む
if(fp == NULL)
{
printf("file open error\n");
} else
{
for(k = 0; k < num; k++)
{
largeX = 0.0;
t = 2.0*PI*k / (double)N;
for(n = 0; n < num; n++)
{
largeX -= x[n] * sin(n*t);
}
fprintf(fp, "%f\n", largeX);
}
}

fclose(fp);
}

void InverseFourier(int num)
{
FILE *fp;
int k, n;
double a[N+100], b[N+100], x, t;
//a:reX, b:imX

fp = fopen("reX.txt", "r"); //読み込み
if(fp == NULL)
{
printf("file open error\n");
} else
{
for(k = 0; k < num; k++)
{
fscanf(fp, "%lf", &a[k]);
//printf("a[%d]=%f\n", k, a[k]);
}
}

fp = fopen("imX.txt", "r"); //読み込み
if(fp == NULL)
{
printf("file open error\n");
} else
{
for(k = 0; k < num; k++)
{
fscanf(fp, "%lf", &b[k]);
//printf("b[%d]=%f\n", k, b[k]);
}
}

fp = fopen("re-1.txt", "w"); //読み込み
if(fp == NULL)
{
printf("file open error\n");
} else
{
for(n = 0; n < num; n++)
{
x = 0.0;
t = 2.0*PI*(double)n / (double)N;
for(k = 0; k < num; k++)
{
x +=a[k] *cos(k*t) - b[k] *sin(k*t);
}
x /= (double)N;
fprintf(fp, "%f\n", x);
//printf("x[%d]=%f\n", n, x);
}
}
/*
fp = fopen("im-1.txt", "w"); //読み込み
if(fp == NULL)
{
printf("file open error\n");
} else
{
for(n = 0; n < num; n++)
{
x = 0.0;
for(k = 0; k < num; k++)
{
t = 2.0*PI*(double)k / (double)N;
x = x + a[k] *sin(n*t) + b[k] *cos(n*t);
}
x /= (double)N;
fprintf(fp, "%f\n", x);
}
}
*/

fclose(fp);
}

int main(void)
{
SinCurve(N, PI/8.0, 0.0, 1.0);

//Gauss(N, 1.0, 0.0);

Fourier(N, "sin.txt");

//Fourier(N, "gauss.txt");

InverseFourier(N);

return 0;
}

正弦波(およびガウス性雑音)をフーリエ変換(離散)→逆フーリエ変換するというプログラムを組みました。正弦波をフーリエ変換すると実部は2回ピークがくるはずなのですが、すべて「0.000000」または「-0.000000」と表示されてしまいます。虚部は正常なようで実装の仕方もさほど違わないので、何が問題なのかわからずにいます。念のためコードはすべて載せますが、該当箇所は関数Fourierの
fp = fopen("reX.txt", "w");//書き込む
あたりです。問題点を教えていただけないでしょうか。お願いします。


//gauss.txt...続きを読む

Aベストアンサー

元のデータがsin関数なら、虚部だけしか出ないので正常では?

fopen()に対応したfclose()が必要なのはその通りなので直すべきですが。

Qlispとその他関数型言語について

「lispを学べば悟りが開ける」という言葉をよく聞きます。

l他のプログラミング言語哲学とは一線を画すほどの教示をもった言語という印象を持ちます。

僕もlispを少し学んだだけですが「悟り」は開けませんでした。

しかし他の関数型言語(haskellとか)ではそういう話は聞きません。

なぜでしょうか。

やっぱ括弧ですか。

Aベストアンサー

他の言語が、まだまだ歴史が浅く、使っている人、特にカリスマと呼べるような人が少ないからではないでしょうか。
それに「haskellを学べば..」などといまさら言っても、二番煎じになってしまいますし。

QC言語でフーリエ変換を作成したいです。

(d^n/dx^n)f(x)=1/2π∫(∞to-∞)(ik)^nF(x)*e^ikxdk
をC言語で表したいのですが、上手くいきません。
nは実数でF(x)はf(x)の微分です。

アイデアだけでもいいので教えてください。

Aベストアンサー

フリーのライブラリを一つ紹介します。

汎用 FFT (高速 フーリエ/コサイン/サイン 変換) パッケージ
Copyright Takuya OOURA, 1996-2001

設計方法も説明されていますので、参考にされてはいかがでしょうか。

参考URL:http://momonga.t.u-tokyo.ac.jp/~ooura/fft-j.html

QLISPで C言語のフォーマット書式の"%02d"

LISPで C言語のフォーマット書式の"%02d"にあたる記述の仕方がわかりません。どのようにすればよいのでしょうか?

Aベストアンサー

Common Lisp で良いのですよね?

(dolist (num '(5 10 200))
(princ (format nil "~2,'0D~%" num)))

実行結果:
05
10
200


format関数
http://www.yuasa.kuis.kyoto-u.ac.jp/~hiraisi/format-func.html

Q離散フーリエ変換をC言語でどの様に書けばいいですか?

C言語でDFT離散フーリエ変換を書くにはどの様に書けばよろしいですか?

Googleで検索すれば書き方は出てくるのですが、使ってる関数がいまいちよく分かりません。


・データの入力

・フーリエ変換の計算

・結果の出力というのをやればいいのは理解できるのですが、C言語でどの様に書けばいいか分からなくて…

Aベストアンサー

学習中である場合とする解答です。使用パソコンは Linuxまたは Mac OSX などの UNIX系OSです。

<・データの入力>
1)エディタで専用データファイルを作ることから始めます。
 マトリックスは、それに対応した数値をファイル内配置します。

  N
  W0 W0 W0 W0 ....
  W0 W1 W2 W3 ....
  W0 W2 W4 W6 ....
  ....
  N0
  N1
  N2
   .
   .

 上記定義されたマトリックスを ↓のようにファイルに書き込む
 仮に整数値としていますが、実数ならば実数値を書き込んで下さい。

5
  0 0 0 0 ....
0 1 2 3 ....
0 2 4 6 ....
  ....
  0
  1
  2
  .
  .


 各数値間は半角スペースで区切ってそれぞれの数式定義対応マトリックスを作ります。
 ファイル名は半角英字がエラーなく行えるので英字ファイル名を使うことを勧めます。

2)データの読み込み
 データの入力は scanf() を使います。
 最初にNを読み込めば、マトリックス行数がわかるため for() を使ってプログラムしますが、慣れない場合は腕力で scanf() 関数を連発するのもひとつの方法です。
 データファイル読み込みに際しての疑問は、作成したプログラムを起動する際、ターミナルのシェルプロンプトとから
   ./a.out<データファイル名
 と打鍵すればデータファイルを取り込むことができます。
 以上をCで表すと次のようになります。scanf() はそちらで勉強して下さい。
 プログラム作成に際しては、一気に書き込まず。途中で printf() を入れてデータ取り込みを確認されることを勧めます。

3)Cプログラム
 /* magatai.c DFT program
  * file name: magatai.c
  * compile: gcc magatai.c
  * execution: ./a.out<data_file
  */

 #define N 10 取り込みデータ数+α

 double n;
 double w[N][N];
 double x[N];

 int main(void)
 {
  int i, j;
  scanf(%d, &n);
  for (i = 0; i < n; i++)
   scanf(%......
   .... ↓のフーリエ式が入る。
   .... ↓↓の結果の出力が入る。
  return 0;
 }


<・フーリエ変換>
 これは for() の入れ子になります。
  for (i = 0; i < n; i++) {
   for (j = 0; j < n; j++ {
    フーリエ変換式;
   }
  }


<・結果の出力>
 printf() を使います。↑のフーリエ・プログラムに続いて書きます。
  for (i = 0; i < n; i++ )
   printf("%f?n", x[i]);

 計算結果を特定のファイルに残したいという場合は、プログラム起動の際、リダイレクトを使います。
   ./a.out<データファイル名>書き込むファイル名
 後は、 cat などを使ってファイルをリストすれば良いでしょう。

参考URL:http://laputa.cs.shinshu-u.ac.jp/~yizawa/InfSys1/basic/chap6/index.htm

学習中である場合とする解答です。使用パソコンは Linuxまたは Mac OSX などの UNIX系OSです。

<・データの入力>
1)エディタで専用データファイルを作ることから始めます。
 マトリックスは、それに対応した数値をファイル内配置します。

  N
  W0 W0 W0 W0 ....
  W0 W1 W2 W3 ....
  W0 W2 W4 W6 ....
  ....
  N0
  N1
  N2
   .
   .

 上記定義されたマトリックスを ↓のようにファイルに書き込む
 仮に整数値としていますが、実数ならば実数値を書き込んで下...続きを読む

Qlispの入門書

lispの入門書を探しています。

lispの書き方をただ説明するだけでなく、他の言語と違ってどういう利点が
あるのかを説明したものがいいです。

なにかおすすめの本があったら教えてください。

Aベストアンサー

・The Little Schemer
Lispの最高の入門書です。一問一答を追っていくことで、リスト操作やLispプログラムを作っていく感覚について皮膚で理解できるようになります。
英語ですが、難しい文章はないのでそれほど問題ないはず。
環境の整えかたなどの記述はいっさいありません。 "Lisp" を実践して学ぶ本です。

・プログラミングGauche
Lispの方言の一つにSchemeという言語があります。その一つの処理系であるGaucheの本です。さいきん出たばっかり。
Gauche のさまざまな組み込み関数を利用することで関数型プログラミングを実践していきます。
日本語で勉強したいならこちらです。

・リスト遊び
日本語だとこの辺も入門書です。あまり詳しく知りませんが、Emacs Lispの本です。
筆者はEmacs上でemailを読めるMewというソフトウェアの開発者でもあるそうです。

Lispの良さについてはネット上の文章を読む方がよろしいかと。適当に、LispとかPaul GrahamとかShiroとかのキーワードを探してみてください。
「ハッカーと画家」を読むのも良いですね。


Lispコミュニティにコミットするのがいちばんですが。

・The Little Schemer
Lispの最高の入門書です。一問一答を追っていくことで、リスト操作やLispプログラムを作っていく感覚について皮膚で理解できるようになります。
英語ですが、難しい文章はないのでそれほど問題ないはず。
環境の整えかたなどの記述はいっさいありません。 "Lisp" を実践して学ぶ本です。

・プログラミングGauche
Lispの方言の一つにSchemeという言語があります。その一つの処理系であるGaucheの本です。さいきん出たばっかり。
Gauche のさまざまな組み込み関数を利用することで関数...続きを読む

QC言語のソースをC++言語に変換したい

C言語で書かれていたソースをC++言語に変換したいのですが
どのような点に気をつければよいでしょうか

現在、プログラムの主な構造は構造体とそれを扱う関数が実装されていて、
これらをクラスを使用して書き換えようと思います。
それ以外に気にしておくものはありますか。

例えば、ヘッダファイルで<stdio.h>をインクルードしているところがありますが、
これは<cstdio>に書き換えたほうがよいかもしれない、と言われたことはあります。
printfなどはprintfのまま使用しても大丈夫ですか。
std::printfに書き換えたり、iostreamを使用する方法に書き換えたほうがいいですか。
規格としてはどのようになっているのでしょうか。
(「過去との互換性のためにあるだけであり、非推奨」とかあったりしますか。)

Aベストアンサー

まず <stdio.h> などは言われるように「非推奨」なので「最終的には変更する」ことを前提にした方がいいでしょうね (たぶん C++1y までは大丈夫だと思うけど). とはいえ, 単純に
<cstdio> を #include しててきとうに std:: を付ける
だけでもだいたいいけますが. あえて <iostream> に直す必要はないです.

まあ, ヘッダ以外は「とりあえず拡張子だけ変えてコンパイルエラーが出たら考える」という行きあたりばったりな方法でもなんとかなっちゃいますけどね.

Q初めて関数型言語を学ぶとしたら、どの言語がお奨めですか?

初めて関数型言語を学ぶとしたら、どの言語がお奨めですか?
JavaScriptをやっていて、関数型言語に興味を持ちました。

いままで、勉強した言語はC < Java < Python < JavaScriptです。(右側の方が比重・興味が大きい)
現在、Web系志望の学生なので、その辺を踏まえてアドバイスいただけると助かります。

今のところ興味を持ってるのは、Common Lisp/Haskellあたりです。

よろしくお願いします。

Aベストアンサー

C言語が「関数型」?なのか、と言われると多分違うと思うんですけどね。普通は命令型/手続き型に分類されるんじゃないか、と思います。

ちなみに、JavaScriptはSchemeに影響を受けてる言語です。それで言うと、SchemeかCommon Lispがいいんじゃないのかな、とは思いますがね。ただ、あんまり関数型、って感じで書かれている本は少ないと思います。

Web系志望と言う事なんで、Common Lispですと、

ANSI Common Lisp: http://www.pej-hed.jp/washo/288.html
にHTML生成のトピックあり。

実践Comon Lisp: http://ssl.ohmsha.co.jp/cgi-bin/menu.cgi?ISBN=978-4-274-06721-1
にAllegro Serveと言うライブラリを利用したWebプログラミングの例があり。HTML生成の例もあり。
原著のサイトでは、
http://www.gigamonkeys.com/book/practical-web-programming-with-allegroserve.html
http://www.gigamonkeys.com/book/practical-an-html-generation-library-the-interpreter.html
http://www.gigamonkeys.com/book/practical-an-html-generation-library-the-compiler.html
辺り。

プログラミング言語Lisp: http://ascii.asciimw.jp/books/books/detail/4-7561-3926-4.shtml
CL-HTTPと言うライブラリを用いたWebサーバーの説明が載っています。
ただし、本自体はMacintosh用の商用実装、Mac Common Lisp

Mac Common Lisp:
http://www.digitool.com/

を用いたものなんで、注意する必要があります。Macを持ってないならあまりお薦めしません。また、若干古い本ですね。

Haskellの方は良く分かりませんが、Common LispならそれなりにWeb関係の簡単なアプリの書き方も紹介されている、と言う事です。

参考までに。

C言語が「関数型」?なのか、と言われると多分違うと思うんですけどね。普通は命令型/手続き型に分類されるんじゃないか、と思います。

ちなみに、JavaScriptはSchemeに影響を受けてる言語です。それで言うと、SchemeかCommon Lispがいいんじゃないのかな、とは思いますがね。ただ、あんまり関数型、って感じで書かれている本は少ないと思います。

Web系志望と言う事なんで、Common Lispですと、

ANSI Common Lisp: http://www.pej-hed.jp/washo/288.html
にHTML生成のトピックあり。

実践Comon Lisp: http://s...続きを読む

QC言語プログラムの質問です。 実数をxを読み込み次の計算をするCプログラムを作成し、そのプログラムリ

C言語プログラムの質問です。
実数をxを読み込み次の計算をするCプログラムを作成し、そのプログラムリストを記しなさい。
2sin(x)cos(x) および sin(2x)
次にこのプログラムを用いて、x=0.785を計算しなさい。

画像のプログラムを作成し、計算をしたのですが、計算結果が全て0.00000となってしまいます。
どこが間違っているか教えてください!

Aベストアンサー

scanfを以下のように変えてください。
scanf("%lf", &x);


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報