白色雑音の作り方

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
yuu

白色雑音の作り方

#1

投稿記事 by yuu » 13年前

wavファイルのステレオの白色雑音をプログラムを書いて作りたいのですがわかりません。
作るのに参考にしたいのでサンプルプログラムを教えてください!!

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: 白色雑音の作り方

#2

投稿記事 by softya(ソフト屋) » 13年前

丸投げはルール上禁止されておりますのでフォーラムルールのテンプレートをご記入ください。
http://dixq.net/board/board.html

ホワイトノイズの特性は分かりますか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: 白色雑音の作り方

#3

投稿記事 by みけCAT » 13年前

何がわからないのですか?
wavファイルのフォーマットですか?
バイナリファイルの書き出し方ですか?
白色雑音の作り方ですか?
プログラムの書き方ですか?

使用したい言語は何ですか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

yuu

Re: 白色雑音の作り方

#4

投稿記事 by yuu » 13年前

すいませんでした。
書きたい言語はC言語で書きたいのですが、
wavファイルの構造は大体わかるのですが、データの部分にどのような感じで書き込めばいいかわかりません。
長さも10秒ぐらいに指定して作りたいです。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: 白色雑音の作り方

#5

投稿記事 by softya(ソフト屋) » 13年前

質問に完全に答えてもらっていないですが、出来ている部分だけでもプログラムを提示して下さい。

私とみけCATさんの疑問をまとめて見ました。
(1)ホワイトノイズの特性は分かりますか?
(2)wavファイルのフォーマットですか?
(3)バイナリファイルの書き出し方ですか?
(4)白色雑音の作り方ですか?
(5)プログラムの書き方ですか?

(2)と(3)と(5)は分かるということで良いんですね?
(1)についてもお応え下さい。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

yuu

Re: 白色雑音の作り方

#6

投稿記事 by yuu » 13年前

コード:

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



int main(void)
{
	FILE *fp;
	fp=fopen("out.wav","wb");
	int b,c;
	unsigned char head[] = {0};



	unsigned char   RiffTag[4];

	RiffTag[0]='R';
	RiffTag[1]='I';
	RiffTag[2]='F';
	RiffTag[3]='F';
	
	unsigned long    SizeOfFile;

	SizeOfFile=44100*2*2*10+556;

	unsigned char   WaveTag[4];

	WaveTag[0]='W';
	WaveTag[1]='A';
	WaveTag[2]='V';
	WaveTag[3]='E';

	unsigned char   FmtTag[4];

	FmtTag[0]='f';
	FmtTag[1]='m';
	FmtTag[2]='t';
	FmtTag[3]=' ';

	unsigned long    SizeOfFmt;

	SizeOfFmt=16;

	unsigned short  FormatID;

	FormatID=1;

	unsigned short  Channels;

	Channels=2;

	unsigned long   SamplingRate;

	SamplingRate=44100;

	unsigned long   BytesPerSec;

	BytesPerSec=SamplingRate*10;

	unsigned short  BlockAlign;

	BlockAlign=4;

	unsigned short  BitsPerSample;

	BitsPerSample=16;

	unsigned char   DataTag[4];

	DataTag[0]='d';
	DataTag[1]='a';
	DataTag[2]='t';
	DataTag[3]='a';

	unsigned long   SizeOfBuffer;

	SizeOfBuffer=44100*2*2*10;
	


	fwrite(RiffTag,sizeof(char),4,fp);
	fwrite(&SizeOfFile,sizeof(long),4,fp);
	fwrite(WaveTag,sizeof(char),4,fp);
	fwrite(FmtTag,sizeof(char),4,fp);
	fwrite(&SizeOfFmt,sizeof(long),1,fp);
	fwrite(&FormatID,sizeof(short),1,fp);
	fwrite(&Channels,sizeof(short),1,fp);
	fwrite(&SamplingRate,sizeof(long),1,fp);
	fwrite(&BytesPerSec,sizeof(long),1,fp);
	fwrite(&BlockAlign,sizeof(short),1,fp);
	fwrite(&BitsPerSample,sizeof(short),1,fp);
	fwrite(DataTag,sizeof(char),4,fp);
	fwrite(&SizeOfBuffer,sizeof(long),1,fp);
	


	for (b=0;b<=44100*10*4;b++){
	c = rand () %65534-32767;
	head [0] = c;
	fwrite(head,1,1,fp);
	
	}
このようにわかる範囲で作ったのですがエラーが出てしまいました。
指摘をお願いします。
プログラムの書き方もはっきりわからないところがあったりしました。
またホワイトノイズは乱数を使ってできると聞いたので、乱数を使って書いてみましたが違いますか?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: 白色雑音の作り方

#7

投稿記事 by softya(ソフト屋) » 13年前

codeタグの間違いは修正しておきました。かならずプレビュー確認してくださいね。
エラーについての詳細を必ず書くようにして下さい。
ちなみに、コンパイルエラーはありません。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: 白色雑音の作り方

#8

投稿記事 by みけCAT » 13年前

unsigned char型のc[0]に-32767~32766という、大きすぎで、
しかも符号付きの整数を代入しようとしているのが気になりました。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: 白色雑音の作り方

#9

投稿記事 by softya(ソフト屋) » 13年前

ちなみにリニアPCMは符号なしのはずです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: 白色雑音の作り方

#10

投稿記事 by softya(ソフト屋) » 13年前

ちなみにコードを見なおした所
SizeOfFile = 44100 * 2 * 2 * 10 + 556;
BytesPerSec = SamplingRate * 10;
がヘッダで怪しい所です。
みけCATさんの指摘した部分も問題ですね。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

yuu

Re: 白色雑音の作り方

#11

投稿記事 by yuu » 13年前

みなさんありがとうございます!!

直したコードを見たいのですが、プレビューはどうやればいいのですか?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: 白色雑音の作り方

#12

投稿記事 by softya(ソフト屋) » 13年前

投稿画面にプレビューボタンがあります。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

yuu1

Re: 白色雑音の作り方

#13

投稿記事 by yuu1 » 13年前

返信からプレビューしても見ることができません。
やり方が間違っているのでしょうか?

何もわからなくてすいません。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: 白色雑音の作り方

#14

投稿記事 by softya(ソフト屋) » 13年前

yuu1 さんが書きました:返信からプレビューしても見ることができません。
やり方が間違っているのでしょうか?
何もわからなくてすいません。
間違った状態でも見ることが出来ないと言うことでしょうか?
それともcodeタグがうまくいかないと言うことでしょうか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

yuu1

Re: 白色雑音の作り方

#15

投稿記事 by yuu1 » 13年前

codeタグがうまくいきません。

ここに直したのを書き込んでくれるのは可能ですか?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: 白色雑音の作り方

#16

投稿記事 by softya(ソフト屋) » 13年前

ここの説明を見てもダメですか?

「C言語何でも質問掲示板~規約~」
http://dixq.net/board/board.html#k10

半角文字じゃないとうまくいきませんが、それは大丈夫でしょうか。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

yuu1

Re: 白色雑音の作り方

#17

投稿記事 by yuu1 » 13年前

説明見てもわかりませんでした。
どうしても修正部分だけ見て直したいのでうまく表示されなくていいのでお願いします(';')

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: 白色雑音の作り方

#18

投稿記事 by softya(ソフト屋) » 13年前

わかりました。うまくいかないcodeタグを付けたままでお願いします。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

yuu1

Re: 白色雑音の作り方

#19

投稿記事 by yuu1 » 13年前

お願いします!!
[]でcodeと/codeが囲まれていませんでした。 by softya(ソフト屋)

コード:

#include <stdio.h>
#include <stdlib.h>
#include<math.h>
 
 
 
int main(void)
{
    FILE *fp;
    fp=fopen("out.wav","wb");
    int b,c;
    unsigned char head[] = {0};
 
 
 
    unsigned char   RiffTag[4];
 
    RiffTag[0]='R';
    RiffTag[1]='I';
    RiffTag[2]='F';
    RiffTag[3]='F';
    
    unsigned long    SizeOfFile;
 
    SizeOfFile=44100*2*2*10+556;
 
    unsigned char   WaveTag[4];
 
    WaveTag[0]='W';
    WaveTag[1]='A';
    WaveTag[2]='V';
    WaveTag[3]='E';
 
    unsigned char   FmtTag[4];
 
    FmtTag[0]='f';
    FmtTag[1]='m';
    FmtTag[2]='t';
    FmtTag[3]=' ';
 
    unsigned long    SizeOfFmt;
 
    SizeOfFmt=16;
 
    unsigned short  FormatID;
 
    FormatID=1;
 
    unsigned short  Channels;
 
    Channels=2;
 
    unsigned long   SamplingRate;
 
    SamplingRate=44100;
 
    unsigned long   BytesPerSec;
 
    BytesPerSec=SamplingRate*10;
 
    unsigned short  BlockAlign;
 
    BlockAlign=4;
 
    unsigned short  BitsPerSample;
 
    BitsPerSample=16;
 
    unsigned char   DataTag[4];
 
    DataTag[0]='d';
    DataTag[1]='a';
    DataTag[2]='t';
    DataTag[3]='a';
 
    unsigned long   SizeOfBuffer;
 
    SizeOfBuffer=44100*2*2*10;
    
 
 
    fwrite(RiffTag,sizeof(char),4,fp);
    fwrite(&SizeOfFile,sizeof(long),4,fp);
    fwrite(WaveTag,sizeof(char),4,fp);
    fwrite(FmtTag,sizeof(char),4,fp);
    fwrite(&SizeOfFmt,sizeof(long),1,fp);
    fwrite(&FormatID,sizeof(short),1,fp);
    fwrite(&Channels,sizeof(short),1,fp);
    fwrite(&SamplingRate,sizeof(long),1,fp);
    fwrite(&BytesPerSec,sizeof(long),1,fp);
    fwrite(&BlockAlign,sizeof(short),1,fp);
    fwrite(&BitsPerSample,sizeof(short),1,fp);
    fwrite(DataTag,sizeof(char),4,fp);
    fwrite(&SizeOfBuffer,sizeof(long),1,fp);
    
 
 
    for (b=0;b<=44100*10*4;b++){
    c = rand () %65534-32767;
    head [0] = c;
    fwrite(head,1,1,fp);
    
    }


yuu1

Re: 白色雑音の作り方

#20

投稿記事 by yuu1 » 13年前

どこにでるんですか?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: 白色雑音の作り方

#21

投稿記事 by softya(ソフト屋) » 13年前

fwriteの使い方を間違っているのに気づきました。
fwrite(RiffTag,sizeof(char),4,fp); だと4バイトですが、
fwrite(&SizeOfFile,sizeof(long),4,fp); 4x4バイト書き出されると思います。
第2と第3パラメータが掛け合わされたサイズでファイルに書き出されるので注意して下さい。

変数で定義してあるなら、
fwrite(RiffTag,sizeof(cRiffTaghar),1,fp);
fwrite(&SizeOfFile,sizeof(SizeOfFile),1,fp); 
と書いたほうが間違いがないのでこちらを使って下さい。

確認のためバイナリエディタで出力ファイル内容を確認することをおすすめします。
おすすめエディタ  TSXBIN
「TSUCHY Soft」
http://www.net3-tv.net/~m-tsuchy/tsuchy/dlpage.htm
「TSUCHY Soft TSXBIN用マクロファイル」
http://www.net3-tv.net/~m-tsuchy/tsuchy/tsxmacro.htm
wav用のマクロを使えば、フォーマット的に問題がないか確認できますよ。

ちなみに私とみけCATさんの指摘した部分は直っていません。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: 白色雑音の作り方

#22

投稿記事 by softya(ソフト屋) » 13年前

yuu1 さんが書きました:どこにでるんですか?
どういう意味の質問でしょうか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

yuu3
記事: 1
登録日時: 13年前

Re: 白色雑音の作り方

#23

投稿記事 by yuu3 » 13年前

fwrite(RiffTag,sizeof(RiffTag),1,fp);
fwrite(&SizeOfFile,sizeof(SizeOfFile),1,fp);
fwrite(WaveTag,sizeof(WaveTag),1,fp);
fwrite(FmtTag,sizeof(FmtTag),1,fp);
fwrite(&SizeOfFmt,sizeof(SizeOfFmt),1,fp);
fwrite(&FormatID,sizeof(FormatID),1,fp);
fwrite(&Channels,sizeof(Channels),1,fp);
fwrite(&SamplingRate,sizeof(SamplingRate),1,fp);
fwrite(&BytesPerSec,sizeof(BytesPerSec),1,fp);
fwrite(&BlockAlign,sizeof(BlockAlign),1,fp);
fwrite(&BitsPerSample,sizeof(BitsPerSample),1,fp);
fwrite(DataTag,sizeof(DataTag),1,fp);
fwrite(&SizeOfBuffer,sizeof(SizeOfBuffer),1,fp);


このように書き直したのですがエラーが出ます。
そのほかの改善点はどこですか?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: 白色雑音の作り方

#24

投稿記事 by softya(ソフト屋) » 13年前

yuu3 さんが書きました: このように書き直したのですがエラーが出ます。
そのほかの改善点はどこですか?
なんか沢山読み飛ばされている気がします。
最初から読み直して私とみけCATさんの指摘ポイントをyuuさんになりに書き出して問題点を推測してみて下さい。
何処を指摘されていましたか?問題がないと思うなら、こちらに納得できるように説明をして下さい。
なかなかバグ取りが進まない人の特徴として、こちらの指摘を重要じゃないと思って読み飛ばす人が多いです。

※ 名前を変えることはルール上禁止させていただいておりますのでyuuさんで統一をお願いします。

あと気になるのは
(1) バイナリエディタの件
(2) 説明をお願いした部分。
softya(ソフト屋) さんが書きました:
yuu1 さんが書きました:どこにでるんですか?
どういう意味の質問でしょうか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

たいちう
記事: 418
登録日時: 14年前

Re: 白色雑音の作り方

#25

投稿記事 by たいちう » 13年前

本筋とは関係ないと思いますが、ソースコードは2つともコンパイル通りませんよね?
mainの終わりの括弧がありません。

yuu
記事: 13
登録日時: 13年前

Re: 白色雑音の作り方

#26

投稿記事 by yuu » 13年前

大変失礼なことをしてしまってすいませんでした。

自分なりに考えてみたのですがわからないところが多々あります。
まずデータの部分は16ビットの場合は符号付き整数(-32768 - 32767) で表わす、と調べたのですが間違っているのでしょうか?

yuu
記事: 13
登録日時: 13年前

Re: 白色雑音の作り方

#27

投稿記事 by yuu » 13年前

たいちうさん気づかなかったです!!
ありがとうございます。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: 白色雑音の作り方

#28

投稿記事 by softya(ソフト屋) » 13年前

yuu さんが書きました: 自分なりに考えてみたのですがわからないところが多々あります。
まずデータの部分は16ビットの場合は符号付き整数(-32768 - 32767) で表わす、と調べたのですが間違っているのでしょうか?
これは私の勘違いかもしれません。だとしたら申し訳ありません。
こういう場合には、波形エディタなどで無音→小さな音→大きな音のwavファイルを作ってバイナリエディタで覗いてみて下さい。
こういう確認を実際にきっちりやるのがプログラムを作る上で大事なことになります。
wavの実際のデータの感触をつかむ&バイナリエディタに慣れると言うメリットもあります。

「Vector:ダウンロード Windows > 画像&サウンド > 音声 録音・再生 > 音声ファイルエディタ」
http://www.vector.co.jp/vpack/filearea/ ... ound/edit/
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: 白色雑音の作り方

#29

投稿記事 by softya(ソフト屋) » 13年前

やはり符号付きのようです。と言うことで私の勘違いでした。
申し訳ありません。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

yuu
記事: 13
登録日時: 13年前

Re: 白色雑音の作り方

#30

投稿記事 by yuu » 13年前

あとは
SizeOfFile = 44100 * 2 * 2 * 10 + 556;
BytesPerSec = SamplingRate * 10;

の部分が怪しいということで、これは何が間違っているのでしょうか?

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: 白色雑音の作り方

#31

投稿記事 by みけCAT » 13年前

yuu さんが書きました:まずデータの部分は16ビットの場合は符号付き整数(-32768 - 32767) で表わす、と調べたのですが間違っているのでしょうか?
符号付きであること自体は問題ありません。
-32767~32766という大きな値を、
(一般的な環境では)0~255しか格納できないunsigned char型の変数に代入しようとしているのが問題です。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: 白色雑音の作り方

#32

投稿記事 by softya(ソフト屋) » 13年前

yuu さんが書きました:あとは
SizeOfFile = 44100 * 2 * 2 * 10 + 556;
BytesPerSec = SamplingRate * 10;

の部分が怪しいということで、これは何が間違っているのでしょうか?
その要素の説明と計算の根拠を説明してみて下さい。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

yuu
記事: 13
登録日時: 13年前

Re: 白色雑音の作り方

#33

投稿記事 by yuu » 13年前

SizeofFileの部分は10秒のファイルを作るということでサンプリングレート44100*10+36に変えてみたのですがこれで大丈夫でしょうか?

BytesPerSecのところはステレオなので44100*2*2に変えてみましたがこれでよろしいでしょうか?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: 白色雑音の作り方

#34

投稿記事 by softya(ソフト屋) » 13年前

yuu さんが書きました:SizeofFileの部分は10秒のファイルを作るということでサンプリングレート44100*10+36に変えてみたのですがこれで大丈夫でしょうか?

BytesPerSecのところはステレオなので44100*2*2に変えてみましたがこれでよろしいでしょうか?
項目の理解が曖昧なので、どういう値を入れて良いのかわからないんだと思います。なので理解度知りたいので項目の説明をお願いします。
実際のデータで検証して見ることも大事だと思いますが。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

yuu
記事: 13
登録日時: 13年前

Re: 白色雑音の作り方

#35

投稿記事 by yuu » 13年前

RiffTagにはRIFFという文字列が入る

SizeofFileにはwavetag以降のデータのサイズが入るので、10秒のwavファイルを作りたいので44100*2*2*10+36

WaveTagはRIFFの種類がWAVEであることを表すのでWAVEという文字列が入る

FmtTag fmtが入る(スペースも含む)

SizeOfFmt fmtチャンクのバイト数でリニアPCMなので16


FormatID フォーマットID リニアPCMなので1

channels チャンネル数 ステレオを作りたいので2

SamplingRate サンプリングレート これは44100Hzのを作りたいので44100

BytesPerSec データ速度(byte/sec) 44100hz 16bit ステレオをつくりたいので44100*2*2

BlockAlign ブロックサイズ これは16bitステレオなので2*2=4

BitsPerSample  サンプルあたりのビット数 16bitを作りたいので16

DataTag dataチャンク dataという文字列が入る

SizeOfBuffer 波形データのバイト数 これは44100*2*2*10

後は波形データが入る

このような感じで調べて理解しているんですがどうですか?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: 白色雑音の作り方

#36

投稿記事 by softya(ソフト屋) » 13年前

yuu さんが書きました:RiffTagにはRIFFという文字列が入る

SizeofFileにはwavetag以降のデータのサイズが入るので、10秒のwavファイルを作りたいので44100*2*2*10+36

WaveTagはRIFFの種類がWAVEであることを表すのでWAVEという文字列が入る

FmtTag fmtが入る(スペースも含む)

SizeOfFmt fmtチャンクのバイト数でリニアPCMなので16


FormatID フォーマットID リニアPCMなので1

channels チャンネル数 ステレオを作りたいので2

SamplingRate サンプリングレート これは44100Hzのを作りたいので44100

BytesPerSec データ速度(byte/sec) 44100hz 16bit ステレオをつくりたいので44100*2*2

BlockAlign ブロックサイズ これは16bitステレオなので2*2=4

BitsPerSample  サンプルあたりのビット数 16bitを作りたいので16

DataTag dataチャンク dataという文字列が入る

SizeOfBuffer 波形データのバイト数 これは44100*2*2*10

後は波形データが入る

このような感じで調べて理解しているんですがどうですか?
やはり、今までは勘違いされていた部分がありますね。今回のこの理解でOKだと思います。
残りはWAVデータ自体の書き出しですがcharではダメだと指摘さていますので、他のデータ型を使ってみましょう。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

yuu
記事: 13
登録日時: 13年前

Re: 白色雑音の作り方

#37

投稿記事 by yuu » 13年前

sofyaさんありがとうございます。
あとはデータのところなんですが、これはint型で大丈夫でしょうか?
データの部分は調べたのですが、書き方とか数値の入れ方とかいろいろと詳しく載っているところがなくて困っているんですが
データの部分はどのような感じで書けばよろしいでしょうか??

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: 白色雑音の作り方

#38

投稿記事 by softya(ソフト屋) » 13年前

intではありません。
条件はyuuさん自身が書いてますが16bit(2バイト)で整数型で符号付きです。
>まずデータの部分は16ビットの場合は符号付き整数(-32768 - 32767) で表わす、と調べたのですが間違っているのでしょうか?

「整数型 - Wikipedia」 整数型の種類。ココに書かれていない環境もあります。
http://ja.wikipedia.org/wiki/%E6%95%B4% ... B.E5.90.8D

この中でyuuさん自身の環境(OSやコンパイラ)で該当する型を選ぶことになります。
今まで提示されたコードによるとlongで4バイトみたいですからC/C++(LLP64)が該当する環境だと思います。
既にyuuさん自身が符号なしですが2バイトの整数型は使っていますので分かっていると思っていたのですが。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

yuu
記事: 13
登録日時: 13年前

Re: 白色雑音の作り方

#39

投稿記事 by yuu » 13年前

いろんなサイトで調べてみるとshortとかlongとか書いてあったので
プログラムを作っていくうちにごちゃごちゃしてよくわからなくなっていました。
今回はlong型で大丈夫そうですので、long型で書いていきたいです。

実際にファイルに書き込む場合はその白色雑音自体は乱数を使って書きたいのですが、
その部分が一番わかりませんでした。

まず、適当な音を出せるようにまでなりたいのですが、データの書き方はどんな感じになるのでしょうか?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: 白色雑音の作り方

#40

投稿記事 by softya(ソフト屋) » 13年前

あの表の読み方がわかりませんか?
C/C++(LLP64)の場合

コード:

符号	bit		byte	型
有		16		2		short
です。
バイナリデータを扱う場合は、long long/long/int/short/charのバイト数をちゃんと理解していないと絶対にうまく作れません。
まずちゃんと理解しないといけないのは、このポイントです。非常に重要なので、ここを適当に済ませてはいけません。

>実際にファイルに書き込む場合はその白色雑音自体は乱数を使って書きたいのですが、
>その部分が一番わかりませんでした。

shortの変数にご自身が書いた通り-32768から32767の範囲の数値乱数を入れて、それをファイル出力するだけですよ。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

yuu
記事: 13
登録日時: 13年前

Re: 白色雑音の作り方

#41

投稿記事 by yuu » 13年前

データの部分を下のようにしてみたのですがこれでは音が出ませんでした。

コード:



	 for (int b=0;b<=44100*10*4;b++){
              short c;

		b=b++;
		c = rand () %65534-32767;

    fwrite(&c,sizeof(short),1,fp);
    
    }



 

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: 白色雑音の作り方

#42

投稿記事 by softya(ソフト屋) » 13年前

今現在のコードを全て掲載して下さい。

コード:

 → [code=cpp]
b=b++; 意味がありませんと言うか動作未定義です。やめてください。
データの書き出しとしては合っているはずですので、バイナリエディタでの確認をおすすめします。
WAVマクロを必ず入れること。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

yuu
記事: 13
登録日時: 13年前

Re: 白色雑音の作り方

#43

投稿記事 by yuu » 13年前

コード:


#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int main(void){

	FILE *fp;
	unsigned char s[4];
	char head[]={0};
	unsigned long var_long,file_size;
	unsigned short var_short;
	unsigned long i;
	file_size=44100*2*2*10;
	


	fp=fopen("a.wav","wb");

	s[0] = 'R';
	s[1] = 'I';
	s[2] = 'F';
	s[3] = 'F';
	fwrite(s, sizeof(char), 4, fp);//RIFFヘッダ

	var_long=36+file_size;//ファイルサイズ
	fwrite(&var_long,sizeof(long),1,fp);

	s[0] = 'W';
	s[1] = 'A';
	s[2] = 'V';
	s[3] = 'E';
	fwrite(s, sizeof(char), 4, fp);//WAVEヘッダ

	
	s[0] = 'f';
	s[1] = 'm';
	s[2] = 't';
	s[3] = ' ';
	fwrite(s, sizeof(char), 4, fp);//fmtチャンク

	var_long = 16;
	fwrite(&var_long, sizeof(long), 1, fp);//fmtチャンクのバイト数

	var_short = 1;//フォーマットID
	fwrite(&var_short, sizeof(short), 1, fp);

	var_short = 2;//チャンネル数 ステレオ
	fwrite(&var_short, sizeof(short), 1, fp);


	var_long = 44100;//サンプリングレート
	fwrite(&var_long, sizeof(long), 1, fp);

	var_long=44100*2*2;//データ速度
	fwrite(&var_long, sizeof(long), 1, fp);

	var_short =4;//ブロックサイズ(byte/sample*チャンネル数)
	fwrite(&var_short, sizeof(short), 1, fp);

	var_short = 16;//サンプルあたりのビット数(bit/sample)
	fwrite(&var_long, sizeof(short), 1, fp);

	s[0] = 'd';
	s[1] = 'a';
	s[2] = 't';
	s[3] = 'a';
	fwrite(s, sizeof(char), 4, fp);
	
	fwrite(&file_size,sizeof(long),1,fp);

	short ptr[44100*2*2*10];

	for(i=0;i<44100*2*2*10;i++){

		ptr[i]=rand()%65534-32767;
	}


    fwrite(ptr,sizeof(short),4,fp);
    

	fclose(fp);

	return 0;
}



今のところ試行錯誤していろいろ変えてみてこのようなプログラムになっています。
データの部分以外はエラーなしにビルドされるのですが、やはりデータの部分を入れてしまうとエラーが出てしまいます。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: 白色雑音の作り方

#44

投稿記事 by softya(ソフト屋) » 13年前

これから見ますがバイナリエディタの件はわざと無視されているのでしょうか?
真剣に取り組んでいただきたいのですが。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

yuu
記事: 13
登録日時: 13年前

Re: 白色雑音の作り方

#45

投稿記事 by yuu » 13年前

すいませんでした。
バイナリエディタの件については一応エディタを見ながらやっていますが、一応数値はちゃんと書きだされているのですが・・・
音は全くでないです。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: 白色雑音の作り方

#46

投稿記事 by softya(ソフト屋) » 13年前

yuu さんが書きました:すいませんでした。
バイナリエディタの件については一応エディタを見ながらやっていますが、一応数値はちゃんと書きだされているのですが・・・
音は全くでないです。
マクロは導入されましたか?
RIFF:ANI,AVI,DAT,RMI,RMP,WAVマクロだとこんな感じです。

コード:

000000  RIFFChunk.fccName[0]             52 49 46 46
000004  RIFFChunk.cbChunk                001AEAC4
000008  RIFFChunk.fccForm[0]             57 41 56 45
00000C  fmt Chunk.fccName[0]             66 6D 74 20
000010  fmt Chunk.cbChunk                00000010
000014  PcmWaveFormat.wf.wFormatTag      0001
000016  PcmWaveFormat.wf.nChannels       0002
000018  PcmWaveFormat.wf.nSamplesPerSec  0000AC44
00001C  PcmWaveFormat.wf.nAvgBytesPerSec 0002B110
000020  PcmWaveFormat.wf.nBlockAlign     0004
000022  PcmWaveFormat.wBitsPerSample     B110
000024  dataChunk.fccName[0]             64 61 74 61
000028  dataChunk.cbChunk                001AEAA0
wavマクロだと、こうです。

コード:

000000  RIFF.ID[0]          52 49 46 46
000004  RIFF.Size           001AEAC4
000008  RIFF.FileType[0]    57 41 56 45
00000C  Chanck.ID[0]        66 6D 74 20
000010  Chanck.Size         00000010
000014  PCM              0001
000016  ステレオ            0002
000018  標本化周波数        0000AC44
00001C  転送バイト数        0002B110
000020  サンプルサイズ      0004
000022  量子化ビット数      B110
000024  Chanck.ID[0]        64 61 74 61
000028  Chanck.Size         001AEAA0
値に問題ありますので検証してみて下さい。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

yuu
記事: 13
登録日時: 13年前

Re: 白色雑音の作り方

#47

投稿記事 by yuu » 13年前

コード:

 

#include<stdio.h>
#include<stdlib.h>
int main(void){

	FILE *fp;
	unsigned char s[4];
	short head[]={0};
	unsigned long var_long,file_size;
	unsigned short var_short;
	unsigned long i;
	file_size=44100*2*2*10;
	


	fp=fopen("a.wav","wb");

	s[0] = 'R';
	s[1] = 'I';
	s[2] = 'F';
	s[3] = 'F';
	fwrite(s, sizeof(char), 4, fp);//RIFFヘッダ

	var_long=36+file_size;//ファイルサイズ
	fwrite(&var_long,sizeof(long),1,fp);

	s[0] = 'W';
	s[1] = 'A';
	s[2] = 'V';
	s[3] = 'E';
	fwrite(s, sizeof(char), 4, fp);//WAVEヘッダ

	
	s[0] = 'f';
	s[1] = 'm';
	s[2] = 't';
	s[3] = ' ';
	fwrite(s, sizeof(char), 4, fp);//fmtチャンク

	var_long = 16;
	fwrite(&var_long, sizeof(long), 1, fp);//fmtチャンクのバイト数

	var_short = 1;//フォーマットID
	fwrite(&var_short, sizeof(short), 1, fp);

	var_short = 2;//チャンネル数 ステレオ
	fwrite(&var_short, sizeof(short), 1, fp);


	var_long = 44100;//サンプリングレート
	fwrite(&var_long, sizeof(long), 1, fp);

	var_long=44100*2*2;//データ速度
	fwrite(&var_long, sizeof(long), 1, fp);

	var_short =4;//ブロックサイズ(byte/sample*チャンネル数)
	fwrite(&var_short, sizeof(short), 1, fp);

	var_short = 16;//サンプルあたりのビット数(bit/sample)
	fwrite(&var_short, sizeof(short), 1, fp);

	s[0] = 'd';
	s[1] = 'a';
	s[2] = 't';
	s[3] = 'a';
	fwrite(s, sizeof(char), 4, fp);
	
	fwrite(&file_size,sizeof(long),1,fp);

	for(i=0;i<file_size;i++){

		head[0]=rand()%65534-32767;
		fwrite(head,1,1,fp);
	}

    

	fclose(fp);

	return 0;
}



上記のように修正して実行しましたら作ることができました。
さらにこのプログラムにレベル-10dBに指定して作りたいのですがどうすればよろしいのでしょうか?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: 白色雑音の作り方

#48

投稿記事 by softya(ソフト屋) » 13年前

fwrite(head,1,1,fp);が間違っています。なぜ16bitのデータを1バイトづつ書くのでしょうか?
ホワイトノイズですから偶然動いてますが-10dbするなら問題が表面化します。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

yuu
記事: 13
登録日時: 13年前

Re: 白色雑音の作り方

#49

投稿記事 by yuu » 13年前

fwrite(data,sizeof(short),1,fp)のように変えればいいですか?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: 白色雑音の作り方

#50

投稿記事 by softya(ソフト屋) » 13年前

yuu さんが書きました:fwrite(data,sizeof(short),1,fp)のように変えればいいですか?
その通りですが、その場合は、
for(i=0;i<file_size;i++){
も直さないと行けません。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: 白色雑音の作り方

#51

投稿記事 by softya(ソフト屋) » 13年前

音量の件ですが、
dB=20xlog(最大音/最小音)
で求められるので
16bitで65535段階ですから
dB=20xlog(65535/1)≒96
で約96dBです。

これより-10dBしますので
86=20xlog(x/1)
を解いて下さい。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

yuu
記事: 13
登録日時: 13年前

Re: 白色雑音の作り方

#52

投稿記事 by yuu » 13年前

どのように直せばいいのでしょうか?
file_sizeの2倍にすればいいですか?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: 白色雑音の作り方

#53

投稿記事 by softya(ソフト屋) » 13年前

yuu さんが書きました:どのように直せばいいのでしょうか?
file_sizeの2倍にすればいいですか?
わかりませんか?
file_sizeは何のサイズでしょうか?
掛けあわせたものを再分解して考えてみて下さい。
このfor(i=0;i<file_size;i++){はループ回数です。
出力されるサイズは fwriteサイズ x ループ回数となります。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: 白色雑音の作り方

#54

投稿記事 by みけCAT » 13年前

softya(ソフト屋) さんが書きました:音量の件ですが、
dB=20xlog(最大音/最小音)
で求められるので
16bitで65535段階ですから
dB=20xlog(65535/1)≒96
で約96dBです。

これより-10dBしますので
86=20xlog(x/1)
を解いて下さい。
横入り失礼します。
-10dBって、こんなに小さいものなのですか?何か間違っていますか?

コード:

#include <stdio.h>
#include <math.h>
 
int main(void) {
        int i;
        for(i=1;20*log(i/1)<86;i++);
        printf("%d %f\n",i,20*log(i/1));
        return 0;
}
出力

コード:

74 86.081302
http://ideone.com/RqEXC
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: 白色雑音の作り方

#55

投稿記事 by softya(ソフト屋) » 13年前

みけCAT さんが書きました:
softya(ソフト屋) さんが書きました:音量の件ですが、
dB=20xlog(最大音/最小音)
で求められるので
16bitで65535段階ですから
dB=20xlog(65535/1)≒96
で約96dBです。

これより-10dBしますので
86=20xlog(x/1)
を解いて下さい。
横入り失礼します。
-10dBって、こんなに小さいものなのですか?何か間違っていますか?

コード:

#include <stdio.h>
#include <math.h>
 
int main(void) {
        int i;
        for(i=1;20*log(i/1)<86;i++);
        printf("%d %f\n",i,20*log(i/1));
        return 0;
}
出力

コード:

74 86.081302
http://ideone.com/RqEXC
電卓で計算する限り、そんな値では無いですね。
あれ? C/C++のlogの底って10じゃなかった様な・・・。

【補足】
log10()をお使いください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: 白色雑音の作り方

#56

投稿記事 by みけCAT » 13年前

なるほど、底は10ですか。

コード:

#include <stdio.h>
#include <math.h>
 
int main(void) {
        int i;
        for(i=1;20*log10(i/1.0)<86;i++);
        if(i>0)printf("%d %f\n",i-1,20*log10((i-1)/1.0));
        printf("%d %f\n",i,20*log10(i/1.0));
        return 0;
}
出力

コード:

19952 85.999729
19953 86.000164
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: 白色雑音の作り方

#57

投稿記事 by softya(ソフト屋) » 13年前

19953 とか、そんな値で良いはずです。
まぁ、私がdBが得意ってわけではないので間違っているかも知れませんが最大に対する相対-10dBならこれで良いはずです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

閉鎖

“C言語何でも質問掲示板” へ戻る