OSDN Git Service

Updated the depended module.
[bluetank/bluetank.git] / soft / utils / ffttool / main.c
1 \r
2 #include <stdio.h>\r
3 #include <stdlib.h>\r
4 #include "wave.h"\r
5 #include "fft.h"\r
6 #include "wavfile.h"\r
7 \r
8 /**\r
9  * @brief \83G\83\89\81[\82ª\82 \82Á\82½\8e\9e\82É\95W\8f\80\8fo\97Í\82É\89½\82©\8fo\82·\81B\r
10  *\r
11  * @param RESULT \83G\83\89\81[\83R\81[\83h\81B\r
12  */\r
13 #define WAVFILE_ERROR_PRINT(RESULT) \\r
14     do { \\r
15         WavFileResult R = RESULT; \\r
16         if (R != WavFileResultOK) { \\r
17             char wavfile_error_print_text[BUFSIZ]; \\r
18             wavfile_result_string(R, wavfile_error_print_text, sizeof(wavfile_error_print_text)); \\r
19             printf("%s (code=%d)\n", wavfile_error_print_text, R); \\r
20             return 1; \\r
21         } \\r
22     } while(0)\r
23 \r
24 /**\r
25  * @brief Channel separation test.\r
26  *\r
27  * @param filename Source file name.\r
28  */\r
29 static int channel_separation(const char *filename)\r
30 {\r
31     WavFileResult result;\r
32     wavfile_info_t info_input;\r
33     wavfile_info_t info_output;\r
34     WAVFILE *wf_input;\r
35     WAVFILE *wf_output[WAVFILE_MAXIMUM_CHANNELS];\r
36     int i;\r
37 \r
38     /*\r
39      * \93ü\97Í\83t\83@\83C\83\8b\82ð\8aJ\82­\81B\r
40      */\r
41     wf_input = wavfile_open(filename, WavFileModeRead, &result);\r
42     WAVFILE_ERROR_PRINT(result);\r
43 \r
44     /*\r
45      * \93ü\97Í\83t\83@\83C\83\8b\82©\82ç\8fî\95ñ\82ð\93Ç\82Ý\8d\9e\82Þ\81B\r
46      */\r
47     WAVFILE_ERROR_PRINT(wavfile_read_info(wf_input, &info_input));\r
48 \r
49     /*\r
50      * \8e¯\95Ê\8fî\95ñ\82ð\95\\8e¦\82·\82é\81B\r
51      */\r
52     printf("[INPUT]\n");\r
53     printf("\tWAVFILE_INFO_AUDIO_FORMAT(&info)    = %d\n", WAVFILE_INFO_AUDIO_FORMAT(&info_input));\r
54     printf("\tWAVFILE_INFO_NUM_CHANNELS(&info)    = %d\n", WAVFILE_INFO_NUM_CHANNELS(&info_input));\r
55     printf("\tWAVFILE_INFO_SAMPLE_RATE(&info)     = %d\n", WAVFILE_INFO_SAMPLE_RATE(&info_input));\r
56     printf("\tWAVFILE_INFO_BYTE_RATE(&info)       = %d\n", WAVFILE_INFO_BYTE_RATE(&info_input));\r
57     printf("\tWAVFILE_INFO_BLOCK_ALIGN(&info)     = %d\n", WAVFILE_INFO_BLOCK_ALIGN(&info_input));\r
58     printf("\tWAVFILE_INFO_BITS_PER_SAMPLE(&info) = %d\n", WAVFILE_INFO_BITS_PER_SAMPLE(&info_input));\r
59 \r
60     /*\r
61      * \93ü\97Í\82©\82ç\93¾\82½\8fî\95ñ\82ð\8aî\82É\81A\8fo\97Í\82Ì\8fî\95ñ\82ð\90\90¬\82·\82é\81B\r
62      */\r
63     WAVFILE_INFO_AUDIO_FORMAT(&info_output)    = WAVFILE_INFO_AUDIO_FORMAT(&info_input);\r
64     WAVFILE_INFO_NUM_CHANNELS(&info_output)    = WAVFILE_INFO_NUM_CHANNELS(&info_input) / WAVFILE_INFO_NUM_CHANNELS(&info_input);\r
65     WAVFILE_INFO_SAMPLE_RATE(&info_output)     = WAVFILE_INFO_SAMPLE_RATE(&info_input);\r
66     WAVFILE_INFO_BYTE_RATE(&info_output)       = WAVFILE_INFO_BYTE_RATE(&info_input) / WAVFILE_INFO_NUM_CHANNELS(&info_input);\r
67     WAVFILE_INFO_BLOCK_ALIGN(&info_output)     = WAVFILE_INFO_BLOCK_ALIGN(&info_input) / WAVFILE_INFO_NUM_CHANNELS(&info_input);\r
68     WAVFILE_INFO_BITS_PER_SAMPLE(&info_output) = WAVFILE_INFO_BITS_PER_SAMPLE(&info_input);\r
69 \r
70     /*\r
71      * \8e¯\95Ê\8fî\95ñ\82ð\95\\8e¦\82·\82é\81B\r
72      */\r
73     printf("[OUTPUT]\n");\r
74     printf("\tWAVFILE_INFO_AUDIO_FORMAT(&info)    = %d\n", WAVFILE_INFO_AUDIO_FORMAT(&info_output));\r
75     printf("\tWAVFILE_INFO_NUM_CHANNELS(&info)    = %d\n", WAVFILE_INFO_NUM_CHANNELS(&info_output));\r
76     printf("\tWAVFILE_INFO_SAMPLE_RATE(&info)     = %d\n", WAVFILE_INFO_SAMPLE_RATE(&info_output));\r
77     printf("\tWAVFILE_INFO_BYTE_RATE(&info)       = %d\n", WAVFILE_INFO_BYTE_RATE(&info_output));\r
78     printf("\tWAVFILE_INFO_BLOCK_ALIGN(&info)     = %d\n", WAVFILE_INFO_BLOCK_ALIGN(&info_output));\r
79     printf("\tWAVFILE_INFO_BITS_PER_SAMPLE(&info) = %d\n", WAVFILE_INFO_BITS_PER_SAMPLE(&info_output));\r
80 \r
81     /*\r
82      * \83t\83@\83C\83\8b\82ð\8aJ\82¢\82Ä\83w\83b\83_\82ð\8f\91\82­\81B\r
83      */\r
84     for (i = 0; i < WAVFILE_INFO_NUM_CHANNELS(&info_input); i++) {\r
85         /*\r
86          * \8fo\97Í\83t\83@\83C\83\8b\82ð\8aJ\82­\81B\r
87          */\r
88         char buf[BUFSIZ];\r
89         sprintf(buf, "%s-ch%02d.wav", filename, i);\r
90         wf_output[i] = wavfile_open(buf, WavFileModeWrite, &result);\r
91         WAVFILE_ERROR_PRINT(result);\r
92 \r
93         /*\r
94          * \8fo\97Í\83t\83@\83C\83\8b\82Ö\8fî\95ñ\82ð\8f\91\82«\8d\9e\82Þ\81B\r
95          */\r
96         WAVFILE_ERROR_PRINT(wavfile_write_info(wf_output[i], &info_output));\r
97     }\r
98 \r
99     while (1) {\r
100         wavfile_data_t data_input;\r
101         wavfile_data_t data_output;\r
102 \r
103         /*\r
104          * \93ü\97Í\83t\83@\83C\83\8b\82©\82ç\83f\81[\83^\82ð\93Ç\82Ý\8d\9e\82Þ\81B\r
105          */\r
106         WAVFILE_ERROR_PRINT(wavfile_read_data(wf_input, &data_input));\r
107 \r
108         /*\r
109          * \83f\81[\83^\82ª\82±\82ê\88È\8fã\82È\82¯\82ê\82Î\8fI\97¹\81B\r
110          */\r
111         if (WAVFILE_DATA_IS_END_OF_DATA(&data_input)) {\r
112             break;\r
113         }\r
114 \r
115         /*\r
116          * \8fo\97Í\83t\83@\83C\83\8b\82Ö\83f\81[\83^\82ð\8f\91\82«\8d\9e\82Þ\81B\r
117          */\r
118         for (i = 0; i < WAVFILE_DATA_NUM_CHANNELS(&data_input); i++) {\r
119             WAVFILE_DATA_NUM_CHANNELS(&data_output) = 1;\r
120             WAVFILE_DATA_CHANNEL_DATA(&data_output, 0) = WAVFILE_DATA_CHANNEL_DATA(&data_input, i);\r
121             WAVFILE_ERROR_PRINT(wavfile_write_data(wf_output[i], &data_output));\r
122         }\r
123     }\r
124 \r
125     /*\r
126      * \93ü\97Í\83t\83@\83C\83\8b\82ð\95Â\82\82é\81B\r
127      */\r
128     WAVFILE_ERROR_PRINT(wavfile_close(wf_input));\r
129 \r
130     /*\r
131      * \8fo\97Í\83t\83@\83C\83\8b\82ð\95Â\82\82é\81B\r
132      */\r
133     for (i = 0; i < WAVFILE_INFO_NUM_CHANNELS(&info_input); i++) {\r
134         WAVFILE_ERROR_PRINT(wavfile_close(wf_output[i]));\r
135     }\r
136 \r
137     return 0;\r
138 }\r
139 \r
140 \r
141 int main(int argc, char **argv)\r
142 {\r
143     MONO_PCM pcm0;\r
144     int n, k, N;\r
145     double *x_real, *x_imag;\r
146 \r
147     if (argc != 2) {\r
148         printf("ffttool <wave file name>\n");\r
149         return 1;\r
150     }\r
151 \r
152     /* WAVE\83t\83@\83C\83\8b\82©\82ç\83\82\83m\83\89\83\8b\82Ì\89¹\83f\81[\83^\82ð\93ü\97Í\82·\82é */\r
153     mono_wave_read(&pcm0, argv[1]);\r
154 \r
155     N = 64;\r
156     x_real = calloc(N, sizeof(double));\r
157     x_imag = calloc(N, sizeof(double));\r
158 \r
159     for (n = 0; n < N; n++)\r
160     {\r
161         /* x(n)\82Ì\8eÀ\90\94\95\94 */\r
162         x_real[n] = pcm0.s[n];\r
163         /* x(n)\82Ì\8b\95\90\94\95\94 */\r
164         x_imag[n] = 0.0;\r
165     }\r
166 \r
167     /* FFT\82Ì\8cv\8eZ\8c\8b\89Ê\82Íx_real\82Æx_imag\82É\8fã\8f\91\82«\82³\82ê\82é */\r
168     FFT(x_real, x_imag, N);\r
169 \r
170     /* \8eü\94g\90\94\93Á\90« */\r
171     for (k = 0; k < N; k++) {\r
172         printf("%d %f+j%f\n", k, x_real[k], x_imag[k]);\r
173     }\r
174 \r
175     free(pcm0.s);\r
176     free(x_real);\r
177     free(x_imag);\r
178 \r
179     return 0;\r
180 }\r
181 \r