waveファイルの音声データだけをC言語で配列に格納したいです。
(sinwave.wavは2000Hzの音波を1秒間出力するファイルです。)
どなたかお力添えをお願い致します。
##追記:
一から作るのはまだ早いというご指摘を頂いたので
下記サイトを参考にプログラムを更に変更してみました。
https://hwswsgps.hatenablog.com/entry/2018/08/19/172401
しかしコード-1073741819で終了してしまいます。
実際のプログラムは下記の通りです。
C++
1#include <stdio.h> 2#include <math.h> 3#include <stdlib.h> 4#include <malloc.h> 5#pragma warning(disable:4996); 6 7typedef struct 8 9{ 10 11 int fs; //サンプリング周波数 12 13 int bits; //量子化bit数 14 15 int L; //データ長 16 17} WAV_PRM; 18 19double* audiodatasize; 20 21double* audio_read(WAV_PRM* prm, char* filename); 22 23int main() 24{ 25 WAV_PRM prm_in; 26 double* data; 27 FILE* fp = fopen("sinwave.wav", "rb"); 28 FILE* txt = fopen("data.txt", "w"); 29 char fn[] = "sinwave.wav"; 30 data = audio_read(&prm_in, fn); 31 printf("%d", (int)audiodatasize); //ループ回数 32 for (int i = 0; i < (int)audiodatasize; i++) { 33 fprintf(txt, "%f\n", data[i]); 34 } 35 fclose(fp); 36 fclose(txt); 37 return 0; 38} 39 40double* audio_read(WAV_PRM* prm, char* filename) 41 42{ 43 44 //変数宣言 45 46 FILE* fp; 47 48 int n; 49 50 double* data; 51 52 char header_ID[4]; 53 54 long header_size; 55 56 char header_type[4]; 57 58 char fmt_ID[4]; 59 60 long fmt_size; 61 62 short fmt_format; 63 64 short fmt_channel; 65 66 long fmt_samples_per_sec; 67 68 long fmt_bytes_per_sec; 69 70 short fmt_block_size; 71 72 short fmt_bits_per_sample; 73 74 char data_ID[4]; 75 76 long data_size; 77 78 short data_data; 79 80 81 82 //wavファイルオープン 83 84 fp = fopen(filename, "rb"); 85 86 87 88 //wavデータ読み込み 89 90 fread(header_ID, 1, 4, fp); 91 92 fread(&header_size, 4, 1, fp); 93 94 fread(header_type, 1, 4, fp); 95 96 fread(fmt_ID, 1, 4, fp); 97 98 fread(&fmt_size, 4, 1, fp); 99 100 fread(&fmt_format, 2, 1, fp); 101 102 fread(&fmt_channel, 2, 1, fp); 103 104 fread(&fmt_samples_per_sec, 4, 1, fp); 105 106 fread(&fmt_bytes_per_sec, 4, 1, fp); 107 108 fread(&fmt_block_size, 2, 1, fp); 109 110 fread(&fmt_bits_per_sample, 2, 1, fp); 111 112 fread(data_ID, 1, 4, fp); 113 114 fread(&data_size, 4, 1, fp); 115 116 117 118 //パラメータ代入 119 120 prm->fs = fmt_samples_per_sec; 121 122 prm->bits = fmt_bits_per_sample; 123 124 prm->L = data_size / 2; 125 126 127 128 //音声データ代入 129 130 data = (double*)calloc(prm->L, sizeof(double)); 131 audiodatasize = (double*)malloc(sizeof(double) * prm->L); 132 133 for (n = 0; n < prm->L; n++) { 134 135 fread(&data_data, 2, 1, fp); 136 137 data[n] = (double)data_data / 32768.0; 138 139 } 140 141 142 143 fclose(fp); 144 145 return data; 146 147}
出力されたdata.txtの内容は下記のようになりました。
0.000000 0.281036 0.539398 0.754272 0.908325 0.989105 0.990112 0.911255 0.758942 0.545380 0.287842 0.007111 -0.274200 -0.533386 -0.749573 -0.905304 -0.988037 -0.991058 -0.914185 -0.763550 -0.551331 -0.294678 -0.014221 0.267334 0.527344 0.744843 0.902283 0.986938 0.991974 . . . 以下省略
回答2件
あなたの回答
tips
プレビュー