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

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

新規登録して質問してみよう
ただいま回答率
85.48%
アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

2回答

6813閲覧

sin波をテーブルを使って生成したい

退会済みユーザー

退会済みユーザー

総合スコア0

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2015/06/22 15:43

FM音源をソフトウェアで実装するために、正弦関数をテーブルを使って高速に計算する必要があるのですが、それに関し不明な点があるので質問します。

現在の実装はこんな感じです:

lang

1int sin_table[22050]; // 128・sin(2Πx)+128 2 3// Freq : 周波数 4// pos : サンプル位置 (0~SamplePerSec) 5// SamplePerSec : サンプリングレート (=44100) 6// mod : 初期位相 7inline int SIN(int Freq, int pos, int SamplePerSec, int mod){ 8 static const int sine_size = sizeof(sine_table)/sizeof(sine_table[0]); 9 10 return sine_table[ 11 (sine_size*Freq/SamplePerSec*pos)%sine_size 12 ]; 13}

こちらは周波数を受け取って単純な正弦波を返すものです。今のところは0~255の範囲で返ってきます。

実際にはこの関数は初期位相(引数mod)によって値を変える必要があります。用途がFM音源なので、引数には0~255(実際のsin関数でいうところの-1~1)の数値しか渡されません。

・・・というようなものを実装したいのですが、実際にどうコーディングすれば良いのでしょうか?

とりあえず初期位相の分だけ波形を前後にずらす(添字を一定量増減させる)をすればよいこは分かっていて、初期位相が2πFreq*128になればちょうど一周期分ずれることになるはずだと考えてコーディングしています。

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

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

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

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

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

takutok

2015/06/23 04:52

return sine_tableの中の計算がよくわかりませんでした。 sine_tableに必要なサイズを求める計算と、sine_tableの値を取得する計算がごっちゃになっている気がします。 実際にsine_tableに代入する部分はどのようになっていますか?
guest

回答2

0

ちょっと前提条件が良くわからない感じです。

まず、sin_tableの定義というのは

sin_table[i] = (int)((sin(2Π * i / sin_size) + 1.0) * 128.0);

なんでしょうか?

であれば、まず

static const int sine_size = 22050;
int sin_table[sine_size]; // 128・sin(2Πx)+128

ですかね?

とすると、sin(t)として、

t = 2Π * i / sin_size
=> i = sin_size * t / 2Π

なので、一番安直なのは

inline int SIN(double t){
return sine_table[(sin_size * t / 2Π) % sin_size];
}

位相、周波数を指定したいなら

inline int SIN(double t, double freq, double phaze) {
return SIN(t * freq + phaze);
}

って感じではないでしょうか?

よくわからないのは、サンプリングレートというのはここでは、配列の要素数に相当するのではないでしょうか?
であれば、関数に指定するのはおかしそうです。

あと、各種入力が整数になっていますが、それぞれどのような仕様なのかよくわからないです。

投稿2015/06/26 14:41

編集2015/06/26 14:43
fkhideaki

総合スコア19

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

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

0

http://mibai.tec.u-ryukyu.ac.jp/~oshiro/Doc/misc/SinCos_Table.html
こんなのですか?
0~255までしか渡さないのでしたら、256で1回転を表すテーブルを作る方が良いと思いますけど

投稿2015/06/23 06:42

MasaakiIrie

総合スコア1021

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問