質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

2回答

5072閲覧

C#にて周波数解析の方法

kkksan

総合スコア6

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

1クリップ

投稿2018/07/08 11:52

編集2018/07/10 00:21

1kHzノイズの混じったSin波の周波数をフィルタリングにかけて1kHzの成分をのみを取り出したいと思っています。
移動平均、ローパスフィルターは試したのですが、良い結果が得られず他の方法を探しています。

FFT⇒1KHzのみ残すようにフィルタリング⇒iFFT で1kHzの成分のみが出るようなきがするのですが、math.net numericsで具体的にどうやるのかわからず、困っています。
また、他の良い方法がを知っていたらご教授願います。

環境は VS2015のC#にてmath.net numerics を使用して高速フーリエ変換を行っています。
追記1 FFT解析
/// <summary>
/// FFT解析
/// <param name="data">解析値</param>
/// <param name="complexData">戻り値</param>
/// </summary>
public static void FFT(double[] data, ref Complex[] complexData)
{
complexData = data.Select(v => new Complex(v, 0.0)).ToArray();
Fourier.Forward(complexData, FourierOptions.Matlab);
}

ここまでは作成済み complexDataがFFT解析の結果になるのですが、これを

public static void iFFT(ref Complex[] spectrum)
{
Fourier.Inverse(spectrum);
}

のようにやると逆変換になると思う。

FFT → iFFT を実行する前に FFT解析後,Complexデータを1kHzの周波数成分のみにフィルタリング後,iFFTをすると。 Complexデータの実部が1kHzの周波数のみになっている? ようなことをやろうとしていますがComplexデータのフィルタリング方法がわからない。FFTは詳しくないのでそもそも間違っているのか?

追記2 ローパスフィルタ
http://vstcpp.wpblog.jp/?page_id=523

上記サイトを参考にローパスフィルタをC#作成 そもそも音の信号ではない為、がっちりと当てはまっていないのかも

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mituha

2018/07/08 23:30

まず、ご自分で試された方法を記述してください。どの段階で困っているのかわかりません。詳しくないので回答はできませんが、Fourier.Forward -> 処理 -> Fourier.Inverse とか?
ikadzuchi

2018/07/09 13:01

ローパスフィルターにも様々あるのですが、具体的にどのようなローパスフィルターを使ったのでしょうか。そして具体的にどのように良くない結果が出ましたか?
kkksan

2018/07/10 00:23

mituhaさん ikadzuchiさん 回答ありがとうございます。 返信おそくなり申し訳ありませんでした。 追加情報を記載しました。 ご指摘、ありがとうございます。
ikadzuchi

2018/07/27 14:54

すみません、返事を書き込んだつもりだったのですが投稿されていなかったようです。使ったローパスフィルターのコードはわかりました。あとはパラメータにどのような値を設定したかと、具体的にどのように良くない結果が出たかです。
guest

回答2

0

追記2 ローパスフィルタ

http://vstcpp.wpblog.jp/?page_id=523

このサイトの方法は実空間データを次々と操作してフィルタリングする方法
この方法でやるならフーリエ変換がそもそもいらない。

FFT⇒1KHzのみ残すようにフィルタリング⇒iFFT で1kHzの成分のみが出る

あなたが考えるこれは
実空間データを周波数空間に変換して、周波数空間でフィルタして実空間に戻す方法
この方法で1kHzの信号を抜き出したいなら、
フーリエ変換した結果の1kHzに相当する部分以外を全部0にして
逆フーリエ変換すればいい

投稿2018/07/10 00:46

ozwk

総合スコア13521

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kkksan

2018/07/11 07:18

OZWKさん 回答ありがとうございます。 FFTでのフィルタリング方法のアドバイスありがとうございます。 「math.net numerics」「complexData」での1kHz以外の部分をフィルタリングする方法を検討してみます。
guest

0

投稿2018/07/09 02:23

MasahikoHirata

総合スコア3747

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問