ロコリンの雑記

アニメ大好きニートのロコリンのブログ。2015年卒(修士)の社会人。学生時代(2010年)から続けてるブログなのでエントリによっては学生ブログと社会人ブログになっています。時系列から察して。
 
 
このブログについて
ブログ内検索
カテゴリ
プロフィール

ロコリン

Author:ロコリン
2018年5月だけニート(6月から会社員)。2015年3月まで大学院生でした。
趣味:アニメ/Twitter/ゲーム/ニコ動
今(2015年2月更新):プリキュア/プリパラ/アイカツ/ごちうさ/艦これ

外部リンク
Twitter

スポンサーサイト 

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

wav ファイル 

画像を扱えるようになったら、次にやりたいことは音声を扱うことですよね。ということで、簡単な波形を wav ファイルに出力してみました。


wav ファイルの入出力は『物理のかぎしっぽ』のライブラリを使わせていただきました。 『Waveファイルを入出力してみる』 (accessed 2011.02.26) から wave.h と wave.c を拝借しました。 ありがたやありがたや。 (AA 略)

440 Hz (ラ) の正弦波、三角波、矩形波、のこぎり波を出力してみました。

main.cpp (← better C)

#include "wave.h"
#include <cmath>
#include <cstdio>
#define	PI	3.14159265358979323846

/* 三角波 */
double TriangleWave(double x) {
	return asin(sin(x)) * 2. / PI;
}

/* 矩形波 */
double SquareWave(double x) {
	double s = sin(x);
	return (s > 0.) ? 1. : (s < 0.) ? -1. : 0.;
}

/* のこぎり波 */
double SawtoothWave(double x) {
	return 1. - fmod(x, 2. * PI) / PI;
}

/* snd に波形を出力 */
void Mono16MyWave(Sound *snd);

int main(int argc, char *argv[])
{
	Sound *snd;
	char *outFileName = "out.wav";

	/* 新規サウンド */
	if ((snd = Create_Sound(1, 44100, 16, 44100 * 4)) == NULL) {
		return 1;
	}

	/* 波形出力 */
	Mono16MyWave(snd);

	/* ファイルに出力 */
	if (Write_Wave(outFileName, snd)) {
		Free_Sound(snd);
		return 1;
	}

	Free_Sound(snd);

	return 0;
}

void Mono16MyWave(Sound *snd) {
	double amp = 0.75;	/* 1 を最大とした振幅 */
	double freq = 440.0;	/* 周波数 [Hz] */
	double omega = 2. * PI * freq;	/* 角周波数 [rad / s] */

	double y, t;
	const double MAXSMP = (double)((1u << 15) - 1);	/* 16 ビットで表現できる最大値 */

	for (unsigned int i = 0; i < snd->datanum; ++i) {
		t = (double)i / (double)snd->samplingrate;
		y = amp * sin(omega * t);	/* Wave Function */
		snd->monaural16[i] = (short)(y * MAXSMP);
	}
}

結果

どれも振幅は同じなのに、音量が違って聞こえます。

三角波 < 正弦波 << のこぎり波 < 矩形波
といった感じです。たぶん音響工学かなんかについて調べると理由がわかりそうですね。

これらの wav ファイルを mp3 にしてみてください。 正弦波や三角波は圧縮しても劣化が少ないですが、矩形波やのこぎり波は波形が乱れます。 これは mp3 の圧縮の仕組みに起因します。 詳しいことはわかりませんが、 mp3 は離散コサイン変換というのを使って音声の周波数分布を取り出しているっぽいです。 たぶん、振幅の小さな周波数成分の音を削っているんだと思います。 記事『フーリエ解析 1』でそれぞれの波をフーリエ級数で表しました。 正弦波は 1 つの周波数成分だけの波なのでそれだけです。 三角波は倍音を重ね合わせていますが、係数の分母が O(n2) なので早く収束することがわかります。 矩形波とのこぎり波は係数の分母が O(n) なので収束が遅いと考えられます。 よって高周波成分をカットした結果波形が乱れたのだと思います。 (直感で言っているので信じないでください。)

スポンサーサイト
コメント















 管理者にだけ表示を許可する

トラックバック
 
http://rexpit.blog29.fc2.com/tb.php/44-83f57c3c
最新記事
最新コメント
FC2カウンタ
欲しい
最近買ったもの
Amazon 検索
 
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。