白色雑音の作り方
Posted: 2012年7月18日(水) 12:21
wavファイルのステレオの白色雑音をプログラムを書いて作りたいのですがわかりません。
作るのに参考にしたいのでサンプルプログラムを教えてください!!
作るのに参考にしたいのでサンプルプログラムを教えてください!!
#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 さんが書きました:返信からプレビューしても見ることができません。
やり方が間違っているのでしょうか?
何もわからなくてすいません。
#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 さんが書きました:どこにでるんですか?
なんか沢山読み飛ばされている気がします。yuu3 さんが書きました: このように書き直したのですがエラーが出ます。
そのほかの改善点はどこですか?
softya(ソフト屋) さんが書きました:どういう意味の質問でしょうか?yuu1 さんが書きました:どこにでるんですか?
これは私の勘違いかもしれません。だとしたら申し訳ありません。yuu さんが書きました: 自分なりに考えてみたのですがわからないところが多々あります。
まずデータの部分は16ビットの場合は符号付き整数(-32768 - 32767) で表わす、と調べたのですが間違っているのでしょうか?
符号付きであること自体は問題ありません。yuu さんが書きました:まずデータの部分は16ビットの場合は符号付き整数(-32768 - 32767) で表わす、と調べたのですが間違っているのでしょうか?
その要素の説明と計算の根拠を説明してみて下さい。yuu さんが書きました:あとは
SizeOfFile = 44100 * 2 * 2 * 10 + 556;
BytesPerSec = SamplingRate * 10;
の部分が怪しいということで、これは何が間違っているのでしょうか?
項目の理解が曖昧なので、どういう値を入れて良いのかわからないんだと思います。なので理解度知りたいので項目の説明をお願いします。yuu さんが書きました:SizeofFileの部分は10秒のファイルを作るということでサンプリングレート44100*10+36に変えてみたのですがこれで大丈夫でしょうか?
BytesPerSecのところはステレオなので44100*2*2に変えてみましたがこれでよろしいでしょうか?
やはり、今までは勘違いされていた部分がありますね。今回のこの理解で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
後は波形データが入る
このような感じで調べて理解しているんですがどうですか?
#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;
}
マクロは導入されましたか?yuu さんが書きました:すいませんでした。
バイナリエディタの件については一応エディタを見ながらやっていますが、一応数値はちゃんと書きだされているのですが・・・
音は全くでないです。
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
#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;
}
その通りですが、その場合は、yuu さんが書きました:fwrite(data,sizeof(short),1,fp)のように変えればいいですか?
わかりませんか?yuu さんが書きました:どのように直せばいいのでしょうか?
file_sizeの2倍にすればいいですか?
横入り失礼します。softya(ソフト屋) さんが書きました:音量の件ですが、
dB=20xlog(最大音/最小音)
で求められるので
16bitで65535段階ですから
dB=20xlog(65535/1)≒96
で約96dBです。
これより-10dBしますので
86=20xlog(x/1)
を解いて下さい。
#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;
}
電卓で計算する限り、そんな値では無いですね。みけ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; }