This program makes the WAV file of the sinewave in a local file. The sampling frequency is 8KHz. In other words, it is the quality of the telephone. The quantization precision is 16 bits. You can change the frequency of the sinewave, the amplitude by changing a parameter in the top of the program. You can change the file name, too. I suggest that you make the plain name later. You can listen the wav file which You made in Windows Mediaplayer. See: http://blogs.yahoo.co.jp/jf1vrr_station/19862738.html (Japanese)

Dependencies:   TextLCD mbed

Committer:
jf1vrr
Date:
Sat Apr 23 12:34:45 2011 +0000
Revision:
0:436f1e857866
Rev. 0.01A 2011/04/23

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jf1vrr 0:436f1e857866 1 /*This program makes the WAV file of the sinewave in a local file.
jf1vrr 0:436f1e857866 2 The sampling frequency is 8KHz. In other words, it is the quality of the
jf1vrr 0:436f1e857866 3 telephone. The quantization precision is 16 bits. You can change the
jf1vrr 0:436f1e857866 4 frequency of the sinewave, the amplitude by changing a parameter in the
jf1vrr 0:436f1e857866 5 top of the program. You can change the file name, too. I suggest that
jf1vrr 0:436f1e857866 6 you make the plain name later. You can listen the wav file which You made
jf1vrr 0:436f1e857866 7 in Windows Mediaplayer.
jf1vrr 0:436f1e857866 8 */
jf1vrr 0:436f1e857866 9
jf1vrr 0:436f1e857866 10 /*This program is made in reference to "Sound Programming in C Language" by Aoki Naofumi"*/
jf1vrr 0:436f1e857866 11
jf1vrr 0:436f1e857866 12 #define FREQ 440 //Frequency (Hz)
jf1vrr 0:436f1e857866 13 #define AMP 0.5 //Amplitude 0 - 1
jf1vrr 0:436f1e857866 14 #define FILE_NAME "/local/440_05.wav" //Data file name max 8char.wav fffff_aa.wav
jf1vrr 0:436f1e857866 15
jf1vrr 0:436f1e857866 16 #include "mbed.h"
jf1vrr 0:436f1e857866 17 #include "TextLCD.h"
jf1vrr 0:436f1e857866 18
jf1vrr 0:436f1e857866 19 TextLCD lcd(p24, p26, p27, p28, p29, p30);
jf1vrr 0:436f1e857866 20
jf1vrr 0:436f1e857866 21 LocalFileSystem local("local");
jf1vrr 0:436f1e857866 22 DigitalOut led_1(LED1);
jf1vrr 0:436f1e857866 23 DigitalOut led_2(LED2);
jf1vrr 0:436f1e857866 24 DigitalOut led_3(LED3);
jf1vrr 0:436f1e857866 25 DigitalOut led_4(LED4);
jf1vrr 0:436f1e857866 26
jf1vrr 0:436f1e857866 27 int main(void)
jf1vrr 0:436f1e857866 28 {
jf1vrr 0:436f1e857866 29 typedef struct
jf1vrr 0:436f1e857866 30 {
jf1vrr 0:436f1e857866 31 int fs;
jf1vrr 0:436f1e857866 32 int bits;
jf1vrr 0:436f1e857866 33 int length;
jf1vrr 0:436f1e857866 34 double *s;
jf1vrr 0:436f1e857866 35 } MONO_PCM;
jf1vrr 0:436f1e857866 36
jf1vrr 0:436f1e857866 37 FILE *fp;
jf1vrr 0:436f1e857866 38 MONO_PCM pcm;
jf1vrr 0:436f1e857866 39 int i, j;
jf1vrr 0:436f1e857866 40 double s;
jf1vrr 0:436f1e857866 41 short data;
jf1vrr 0:436f1e857866 42 double A, f0;
jf1vrr 0:436f1e857866 43
jf1vrr 0:436f1e857866 44 char riff_chunk_ID[4];
jf1vrr 0:436f1e857866 45 long riff_chunk_size;
jf1vrr 0:436f1e857866 46 char riff_form_type[4];
jf1vrr 0:436f1e857866 47 char fmt_chunk_ID[4];
jf1vrr 0:436f1e857866 48 long fmt_chunk_size;
jf1vrr 0:436f1e857866 49 short fmt_wave_format_type;
jf1vrr 0:436f1e857866 50 short fmt_channel;
jf1vrr 0:436f1e857866 51 long fmt_samples_per_sec;
jf1vrr 0:436f1e857866 52 long fmt_bytes_per_sec;
jf1vrr 0:436f1e857866 53 short fmt_block_size;
jf1vrr 0:436f1e857866 54 short fmt_bits_per_sample;
jf1vrr 0:436f1e857866 55 char data_chunk_ID[4];
jf1vrr 0:436f1e857866 56 long data_chunk_size;
jf1vrr 0:436f1e857866 57
jf1vrr 0:436f1e857866 58 lcd.cls();
jf1vrr 0:436f1e857866 59 lcd.locate(0,0);
jf1vrr 0:436f1e857866 60 lcd.printf("Audio wave\n");
jf1vrr 0:436f1e857866 61
jf1vrr 0:436f1e857866 62 int block_length = 1000;
jf1vrr 0:436f1e857866 63
jf1vrr 0:436f1e857866 64 pcm.fs = 8000;
jf1vrr 0:436f1e857866 65 pcm.bits = 16;
jf1vrr 0:436f1e857866 66 pcm.length = 40000; //about 5sec
jf1vrr 0:436f1e857866 67 pcm.s = (double*) calloc(block_length, sizeof(double));
jf1vrr 0:436f1e857866 68
jf1vrr 0:436f1e857866 69 A = AMP;
jf1vrr 0:436f1e857866 70 f0 = FREQ;
jf1vrr 0:436f1e857866 71
jf1vrr 0:436f1e857866 72 if ( NULL == (fp = fopen(FILE_NAME, "wb" )) )
jf1vrr 0:436f1e857866 73 error( "" );
jf1vrr 0:436f1e857866 74
jf1vrr 0:436f1e857866 75 led_1 = 1;
jf1vrr 0:436f1e857866 76 riff_chunk_ID[0] = 'R';
jf1vrr 0:436f1e857866 77 riff_chunk_ID[1] = 'I';
jf1vrr 0:436f1e857866 78 riff_chunk_ID[2] = 'F';
jf1vrr 0:436f1e857866 79 riff_chunk_ID[3] = 'F';
jf1vrr 0:436f1e857866 80 riff_chunk_size = 36 + pcm.length * 2;
jf1vrr 0:436f1e857866 81 riff_form_type[0] = 'W';
jf1vrr 0:436f1e857866 82 riff_form_type[1] = 'A';
jf1vrr 0:436f1e857866 83 riff_form_type[2] = 'V';
jf1vrr 0:436f1e857866 84 riff_form_type[3] = 'E';
jf1vrr 0:436f1e857866 85
jf1vrr 0:436f1e857866 86 fmt_chunk_ID[0] = 'f';
jf1vrr 0:436f1e857866 87 fmt_chunk_ID[1] = 'm';
jf1vrr 0:436f1e857866 88 fmt_chunk_ID[2] = 't';
jf1vrr 0:436f1e857866 89 fmt_chunk_ID[3] = ' ';
jf1vrr 0:436f1e857866 90 fmt_chunk_size = 16;
jf1vrr 0:436f1e857866 91 fmt_wave_format_type = 1;
jf1vrr 0:436f1e857866 92 fmt_channel = 1;
jf1vrr 0:436f1e857866 93 fmt_samples_per_sec = pcm.fs;
jf1vrr 0:436f1e857866 94 fmt_bytes_per_sec = pcm.fs * pcm.bits / 8;
jf1vrr 0:436f1e857866 95 fmt_block_size = pcm.bits / 8;
jf1vrr 0:436f1e857866 96 fmt_bits_per_sample = pcm.bits;
jf1vrr 0:436f1e857866 97
jf1vrr 0:436f1e857866 98 data_chunk_ID[0] = 'd';
jf1vrr 0:436f1e857866 99 data_chunk_ID[1] = 'a';
jf1vrr 0:436f1e857866 100 data_chunk_ID[2] = 't';
jf1vrr 0:436f1e857866 101 data_chunk_ID[3] = 'a';
jf1vrr 0:436f1e857866 102 data_chunk_size = pcm.length * 2;
jf1vrr 0:436f1e857866 103
jf1vrr 0:436f1e857866 104 fwrite(riff_chunk_ID, 1, 4, fp);
jf1vrr 0:436f1e857866 105 fwrite(&riff_chunk_size, 4, 1, fp);
jf1vrr 0:436f1e857866 106 fwrite(riff_form_type, 1, 4, fp);
jf1vrr 0:436f1e857866 107 fwrite(fmt_chunk_ID, 1, 4, fp);
jf1vrr 0:436f1e857866 108 fwrite(&fmt_chunk_size, 4, 1, fp);
jf1vrr 0:436f1e857866 109 fwrite(&fmt_wave_format_type, 2, 1, fp);
jf1vrr 0:436f1e857866 110 fwrite(&fmt_channel, 2, 1, fp);
jf1vrr 0:436f1e857866 111 fwrite(&fmt_samples_per_sec, 4, 1, fp);
jf1vrr 0:436f1e857866 112 fwrite(&fmt_bytes_per_sec, 4, 1, fp);
jf1vrr 0:436f1e857866 113 fwrite(&fmt_block_size, 2, 1, fp);
jf1vrr 0:436f1e857866 114 fwrite(&fmt_bits_per_sample, 2, 1, fp);
jf1vrr 0:436f1e857866 115 fwrite(data_chunk_ID, 1, 4, fp);
jf1vrr 0:436f1e857866 116 fwrite(&data_chunk_size, 4, 1, fp);
jf1vrr 0:436f1e857866 117 wait(0.5);
jf1vrr 0:436f1e857866 118 led_1 = 0;
jf1vrr 0:436f1e857866 119
jf1vrr 0:436f1e857866 120 led_2 = 1;
jf1vrr 0:436f1e857866 121 for(i = 0; i < pcm.length/block_length; i++)
jf1vrr 0:436f1e857866 122 {
jf1vrr 0:436f1e857866 123
jf1vrr 0:436f1e857866 124 for (j = 0; j < block_length; j++)
jf1vrr 0:436f1e857866 125 {
jf1vrr 0:436f1e857866 126 pcm.s[j] = A * sin(2.0 * 3.141592 * f0 * (i * block_length + j) / pcm.fs);
jf1vrr 0:436f1e857866 127 s = (pcm.s[j] + 1.0) / 2.0 * 65536.0;
jf1vrr 0:436f1e857866 128
jf1vrr 0:436f1e857866 129 if (s > 65535.0) s = 65535.0;
jf1vrr 0:436f1e857866 130 else if (s < 0.0) s = 0.0;
jf1vrr 0:436f1e857866 131
jf1vrr 0:436f1e857866 132 data = (short)(s + 0.5) - 32768;
jf1vrr 0:436f1e857866 133 fwrite(&data, 2, 1, fp);
jf1vrr 0:436f1e857866 134 }
jf1vrr 0:436f1e857866 135 }
jf1vrr 0:436f1e857866 136 led_2 = 0;
jf1vrr 0:436f1e857866 137 fclose(fp);
jf1vrr 0:436f1e857866 138 free(pcm.s);
jf1vrr 0:436f1e857866 139
jf1vrr 0:436f1e857866 140 lcd.locate(0,1);
jf1vrr 0:436f1e857866 141 lcd.printf("Done!\n");
jf1vrr 0:436f1e857866 142
jf1vrr 0:436f1e857866 143 return 0;
jf1vrr 0:436f1e857866 144 }