白色雑音の作り方
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: 白色雑音の作り方
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: 白色雑音の作り方
何がわからないのですか?
wavファイルのフォーマットですか?
バイナリファイルの書き出し方ですか?
白色雑音の作り方ですか?
プログラムの書き方ですか?
使用したい言語は何ですか?
wavファイルのフォーマットですか?
バイナリファイルの書き出し方ですか?
白色雑音の作り方ですか?
プログラムの書き方ですか?
使用したい言語は何ですか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: 白色雑音の作り方
すいませんでした。
書きたい言語はC言語で書きたいのですが、
wavファイルの構造は大体わかるのですが、データの部分にどのような感じで書き込めばいいかわかりません。
長さも10秒ぐらいに指定して作りたいです。
書きたい言語はC言語で書きたいのですが、
wavファイルの構造は大体わかるのですが、データの部分にどのような感じで書き込めばいいかわかりません。
長さも10秒ぐらいに指定して作りたいです。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: 白色雑音の作り方
質問に完全に答えてもらっていないですが、出来ている部分だけでもプログラムを提示して下さい。
私とみけCATさんの疑問をまとめて見ました。
(1)ホワイトノイズの特性は分かりますか?
(2)wavファイルのフォーマットですか?
(3)バイナリファイルの書き出し方ですか?
(4)白色雑音の作り方ですか?
(5)プログラムの書き方ですか?
(2)と(3)と(5)は分かるということで良いんですね?
(1)についてもお応え下さい。
私とみけCATさんの疑問をまとめて見ました。
(1)ホワイトノイズの特性は分かりますか?
(2)wavファイルのフォーマットですか?
(3)バイナリファイルの書き出し方ですか?
(4)白色雑音の作り方ですか?
(5)プログラムの書き方ですか?
(2)と(3)と(5)は分かるということで良いんですね?
(1)についてもお応え下さい。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: 白色雑音の作り方
#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: 白色雑音の作り方
codeタグの間違いは修正しておきました。かならずプレビュー確認してくださいね。
エラーについての詳細を必ず書くようにして下さい。
ちなみに、コンパイルエラーはありません。
エラーについての詳細を必ず書くようにして下さい。
ちなみに、コンパイルエラーはありません。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: 白色雑音の作り方
unsigned char型のc[0]に-32767~32766という、大きすぎで、
しかも符号付きの整数を代入しようとしているのが気になりました。
しかも符号付きの整数を代入しようとしているのが気になりました。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: 白色雑音の作り方
ちなみにリニアPCMは符号なしのはずです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: 白色雑音の作り方
ちなみにコードを見なおした所
SizeOfFile = 44100 * 2 * 2 * 10 + 556;
BytesPerSec = SamplingRate * 10;
がヘッダで怪しい所です。
みけCATさんの指摘した部分も問題ですね。
SizeOfFile = 44100 * 2 * 2 * 10 + 556;
BytesPerSec = SamplingRate * 10;
がヘッダで怪しい所です。
みけCATさんの指摘した部分も問題ですね。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: 白色雑音の作り方
投稿画面にプレビューボタンがあります。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: 白色雑音の作り方
間違った状態でも見ることが出来ないと言うことでしょうか?yuu1 さんが書きました:返信からプレビューしても見ることができません。
やり方が間違っているのでしょうか?
何もわからなくてすいません。
それともcodeタグがうまくいかないと言うことでしょうか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: 白色雑音の作り方
ここの説明を見てもダメですか?
「C言語何でも質問掲示板~規約~」
http://dixq.net/board/board.html#k10
半角文字じゃないとうまくいきませんが、それは大丈夫でしょうか。
「C言語何でも質問掲示板~規約~」
http://dixq.net/board/board.html#k10
半角文字じゃないとうまくいきませんが、それは大丈夫でしょうか。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: 白色雑音の作り方
わかりました。うまくいかないcodeタグを付けたままでお願いします。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: 白色雑音の作り方
お願いします!!
[]でcodeと/codeが囲まれていませんでした。 by softya(ソフト屋)
[]で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);
}
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: 白色雑音の作り方
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さんの指摘した部分は直っていません。
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: 白色雑音の作り方
どういう意味の質問でしょうか?yuu1 さんが書きました:どこにでるんですか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: 白色雑音の作り方
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);
このように書き直したのですがエラーが出ます。
そのほかの改善点はどこですか?
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: 白色雑音の作り方
なんか沢山読み飛ばされている気がします。yuu3 さんが書きました: このように書き直したのですがエラーが出ます。
そのほかの改善点はどこですか?
最初から読み直して私とみけCATさんの指摘ポイントをyuuさんになりに書き出して問題点を推測してみて下さい。
何処を指摘されていましたか?問題がないと思うなら、こちらに納得できるように説明をして下さい。
なかなかバグ取りが進まない人の特徴として、こちらの指摘を重要じゃないと思って読み飛ばす人が多いです。
※ 名前を変えることはルール上禁止させていただいておりますのでyuuさんで統一をお願いします。
あと気になるのは
(1) バイナリエディタの件
(2) 説明をお願いした部分。
softya(ソフト屋) さんが書きました:どういう意味の質問でしょうか?yuu1 さんが書きました:どこにでるんですか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: 白色雑音の作り方
本筋とは関係ないと思いますが、ソースコードは2つともコンパイル通りませんよね?
mainの終わりの括弧がありません。
mainの終わりの括弧がありません。
Re: 白色雑音の作り方
大変失礼なことをしてしまってすいませんでした。
自分なりに考えてみたのですがわからないところが多々あります。
まずデータの部分は16ビットの場合は符号付き整数(-32768 - 32767) で表わす、と調べたのですが間違っているのでしょうか?
自分なりに考えてみたのですがわからないところが多々あります。
まずデータの部分は16ビットの場合は符号付き整数(-32768 - 32767) で表わす、と調べたのですが間違っているのでしょうか?
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: 白色雑音の作り方
これは私の勘違いかもしれません。だとしたら申し訳ありません。yuu さんが書きました: 自分なりに考えてみたのですがわからないところが多々あります。
まずデータの部分は16ビットの場合は符号付き整数(-32768 - 32767) で表わす、と調べたのですが間違っているのでしょうか?
こういう場合には、波形エディタなどで無音→小さな音→大きな音のwavファイルを作ってバイナリエディタで覗いてみて下さい。
こういう確認を実際にきっちりやるのがプログラムを作る上で大事なことになります。
wavの実際のデータの感触をつかむ&バイナリエディタに慣れると言うメリットもあります。
「Vector:ダウンロード Windows > 画像&サウンド > 音声 録音・再生 > 音声ファイルエディタ」
http://www.vector.co.jp/vpack/filearea/ ... ound/edit/
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: 白色雑音の作り方
やはり符号付きのようです。と言うことで私の勘違いでした。
申し訳ありません。
申し訳ありません。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: 白色雑音の作り方
あとは
SizeOfFile = 44100 * 2 * 2 * 10 + 556;
BytesPerSec = SamplingRate * 10;
の部分が怪しいということで、これは何が間違っているのでしょうか?
SizeOfFile = 44100 * 2 * 2 * 10 + 556;
BytesPerSec = SamplingRate * 10;
の部分が怪しいということで、これは何が間違っているのでしょうか?
Re: 白色雑音の作り方
符号付きであること自体は問題ありません。yuu さんが書きました:まずデータの部分は16ビットの場合は符号付き整数(-32768 - 32767) で表わす、と調べたのですが間違っているのでしょうか?
-32767~32766という大きな値を、
(一般的な環境では)0~255しか格納できないunsigned char型の変数に代入しようとしているのが問題です。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: 白色雑音の作り方
その要素の説明と計算の根拠を説明してみて下さい。yuu さんが書きました:あとは
SizeOfFile = 44100 * 2 * 2 * 10 + 556;
BytesPerSec = SamplingRate * 10;
の部分が怪しいということで、これは何が間違っているのでしょうか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: 白色雑音の作り方
SizeofFileの部分は10秒のファイルを作るということでサンプリングレート44100*10+36に変えてみたのですがこれで大丈夫でしょうか?
BytesPerSecのところはステレオなので44100*2*2に変えてみましたがこれでよろしいでしょうか?
BytesPerSecのところはステレオなので44100*2*2に変えてみましたがこれでよろしいでしょうか?
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: 白色雑音の作り方
項目の理解が曖昧なので、どういう値を入れて良いのかわからないんだと思います。なので理解度知りたいので項目の説明をお願いします。yuu さんが書きました:SizeofFileの部分は10秒のファイルを作るということでサンプリングレート44100*10+36に変えてみたのですがこれで大丈夫でしょうか?
BytesPerSecのところはステレオなので44100*2*2に変えてみましたがこれでよろしいでしょうか?
実際のデータで検証して見ることも大事だと思いますが。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: 白色雑音の作り方
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
後は波形データが入る
このような感じで調べて理解しているんですがどうですか?
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: 白色雑音の作り方
やはり、今までは勘違いされていた部分がありますね。今回のこの理解でOKだと思います。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
後は波形データが入る
このような感じで調べて理解しているんですがどうですか?
残りはWAVデータ自体の書き出しですがcharではダメだと指摘さていますので、他のデータ型を使ってみましょう。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: 白色雑音の作り方
sofyaさんありがとうございます。
あとはデータのところなんですが、これはint型で大丈夫でしょうか?
データの部分は調べたのですが、書き方とか数値の入れ方とかいろいろと詳しく載っているところがなくて困っているんですが
データの部分はどのような感じで書けばよろしいでしょうか??
あとはデータのところなんですが、これはint型で大丈夫でしょうか?
データの部分は調べたのですが、書き方とか数値の入れ方とかいろいろと詳しく載っているところがなくて困っているんですが
データの部分はどのような感じで書けばよろしいでしょうか??
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: 白色雑音の作り方
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バイトの整数型は使っていますので分かっていると思っていたのですが。
条件は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(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: 白色雑音の作り方
いろんなサイトで調べてみるとshortとかlongとか書いてあったので
プログラムを作っていくうちにごちゃごちゃしてよくわからなくなっていました。
今回はlong型で大丈夫そうですので、long型で書いていきたいです。
実際にファイルに書き込む場合はその白色雑音自体は乱数を使って書きたいのですが、
その部分が一番わかりませんでした。
まず、適当な音を出せるようにまでなりたいのですが、データの書き方はどんな感じになるのでしょうか?
プログラムを作っていくうちにごちゃごちゃしてよくわからなくなっていました。
今回はlong型で大丈夫そうですので、long型で書いていきたいです。
実際にファイルに書き込む場合はその白色雑音自体は乱数を使って書きたいのですが、
その部分が一番わかりませんでした。
まず、適当な音を出せるようにまでなりたいのですが、データの書き方はどんな感じになるのでしょうか?
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: 白色雑音の作り方
あの表の読み方がわかりませんか?
C/C++(LLP64)の場合 です。
バイナリデータを扱う場合は、long long/long/int/short/charのバイト数をちゃんと理解していないと絶対にうまく作れません。
まずちゃんと理解しないといけないのは、このポイントです。非常に重要なので、ここを適当に済ませてはいけません。
>実際にファイルに書き込む場合はその白色雑音自体は乱数を使って書きたいのですが、
>その部分が一番わかりませんでした。
shortの変数にご自身が書いた通り-32768から32767の範囲の数値乱数を入れて、それをファイル出力するだけですよ。
C/C++(LLP64)の場合 です。
バイナリデータを扱う場合は、long long/long/int/short/charのバイト数をちゃんと理解していないと絶対にうまく作れません。
まずちゃんと理解しないといけないのは、このポイントです。非常に重要なので、ここを適当に済ませてはいけません。
>実際にファイルに書き込む場合はその白色雑音自体は乱数を使って書きたいのですが、
>その部分が一番わかりませんでした。
shortの変数にご自身が書いた通り-32768から32767の範囲の数値乱数を入れて、それをファイル出力するだけですよ。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: 白色雑音の作り方
今現在のコードを全て掲載して下さい。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: 白色雑音の作り方
#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: 白色雑音の作り方
これから見ますがバイナリエディタの件はわざと無視されているのでしょうか?
真剣に取り組んでいただきたいのですが。
真剣に取り組んでいただきたいのですが。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: 白色雑音の作り方
すいませんでした。
バイナリエディタの件については一応エディタを見ながらやっていますが、一応数値はちゃんと書きだされているのですが・・・
音は全くでないです。
バイナリエディタの件については一応エディタを見ながらやっていますが、一応数値はちゃんと書きだされているのですが・・・
音は全くでないです。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: 白色雑音の作り方
マクロは導入されましたか?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
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(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: 白色雑音の作り方
#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: 白色雑音の作り方
fwrite(head,1,1,fp);が間違っています。なぜ16bitのデータを1バイトづつ書くのでしょうか?
ホワイトノイズですから偶然動いてますが-10dbするなら問題が表面化します。
ホワイトノイズですから偶然動いてますが-10dbするなら問題が表面化します。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: 白色雑音の作り方
その通りですが、その場合は、yuu さんが書きました:fwrite(data,sizeof(short),1,fp)のように変えればいいですか?
for(i=0;i<file_size;i++){
も直さないと行けません。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: 白色雑音の作り方
音量の件ですが、
dB=20xlog(最大音/最小音)
で求められるので
16bitで65535段階ですから
dB=20xlog(65535/1)≒96
で約96dBです。
これより-10dBしますので
86=20xlog(x/1)
を解いて下さい。
dB=20xlog(最大音/最小音)
で求められるので
16bitで65535段階ですから
dB=20xlog(65535/1)≒96
で約96dBです。
これより-10dBしますので
86=20xlog(x/1)
を解いて下さい。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: 白色雑音の作り方
わかりませんか?yuu さんが書きました:どのように直せばいいのでしょうか?
file_sizeの2倍にすればいいですか?
file_sizeは何のサイズでしょうか?
掛けあわせたものを再分解して考えてみて下さい。
このfor(i=0;i<file_size;i++){はループ回数です。
出力されるサイズは fwriteサイズ x ループ回数となります。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: 白色雑音の作り方
横入り失礼します。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;
}
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: 白色雑音の作り方
電卓で計算する限り、そんな値では無いですね。みけCAT さんが書きました:横入り失礼します。softya(ソフト屋) さんが書きました:音量の件ですが、
dB=20xlog(最大音/最小音)
で求められるので
16bitで65535段階ですから
dB=20xlog(65535/1)≒96
で約96dBです。
これより-10dBしますので
86=20xlog(x/1)
を解いて下さい。
-10dBって、こんなに小さいものなのですか?何か間違っていますか?出力 http://ideone.com/RqEXC#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; }
あれ? C/C++のlogの底って10じゃなかった様な・・・。
【補足】
log10()をお使いください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: 白色雑音の作り方
なるほど、底は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;
}
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: 白色雑音の作り方
19953 とか、そんな値で良いはずです。
まぁ、私がdBが得意ってわけではないので間違っているかも知れませんが最大に対する相対-10dBならこれで良いはずです。
まぁ、私がdBが得意ってわけではないので間違っているかも知れませんが最大に対する相対-10dBならこれで良いはずです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。