khu

backup

This file is too large to display.
CapsNet @ 7d884474
1 +Subproject commit 7d8844740c119ae66576be9510474a791240a745
1 +{
2 + "cells": [
3 + {
4 + "cell_type": "code",
5 + "execution_count": 7,
6 + "metadata": {},
7 + "outputs": [],
8 + "source": [
9 + "import matplotlib.pyplot as plt\n",
10 + "import numpy as np\n",
11 + "import math\n",
12 + "import librosa"
13 + ]
14 + },
15 + {
16 + "cell_type": "code",
17 + "execution_count": 25,
18 + "metadata": {},
19 + "outputs": [],
20 + "source": [
21 + "'''\n",
22 + "주파수의 구성요소 \n",
23 + "\n",
24 + "wave = 파장(dx), \n",
25 + "amplitude = 진폭(dy)\n",
26 + "1초에 몇번 진동하는지 = 주파수(Frequency) : HZ\n",
27 + "Phase = 위상 (같은 주기와 진폭을 가졌더라도 위상차가 있다면 두 파동이 엇갈린 형태를 갖는다)\n",
28 + "\n",
29 + "'''\n",
30 + "\n",
31 + "audio_path = './'\n",
32 + "filename = audio_path + '1.wav'\n",
33 + "n_mels = 40\n",
34 + "n_frame = 500\n",
35 + "window_size=1024\n",
36 + "hop_size=512\n",
37 + "sample_rate=22050"
38 + ]
39 + },
40 + {
41 + "cell_type": "code",
42 + "execution_count": 26,
43 + "metadata": {},
44 + "outputs": [],
45 + "source": [
46 + "'''\n",
47 + "FFT 계산\n",
48 + "양측파대 설명 = http://linecard.tistory.com/46\n",
49 + "우리는 양측파대 안쓰고 단측파대를 쓰나보지..?\n",
50 + "'''\n",
51 + "Fs = 22050 # 샘플링 주파수\n",
52 + "T = 1/Fs # 샘플링 interval time <-? \n",
53 + "te= 10 #end of time\n",
54 + "t = np.arange(0,te,T) # Time vector (0초부터 te초까지 T간격으로 떨어져있는 배열생성)\n",
55 + "data,fs = librosa.core.load(filename,sr=sample_rate) # load the data\n",
56 + "y = data.T\n",
57 + "\n",
58 + "n= len(y) #신호의 길이 (FFT의 샘플개수 결정) (1000)\n",
59 + "NFFT = n # C++ 에서는 NFFT = 2^nextpow2(length(y)) 해줘야하는데 파이썬에서는 알아서해줌 (FFT의 샘플개수)\n",
60 + "\n",
61 + "k=np.arange(NFFT) #NFFT 샘플개수만큼의 배열 (1000개의 원소)\n",
62 + "\n",
63 + "f0 = k*Fs/NFFT # <- NFFT 샘플개수만큼의 배열 양측파대 (double side frequency) 범위\n",
64 + "\n",
65 + "f0 = f0[range(math.trunc(NFFT/2))]"
66 + ]
67 + },
68 + {
69 + "cell_type": "code",
70 + "execution_count": 27,
71 + "metadata": {
72 + "scrolled": true
73 + },
74 + "outputs": [],
75 + "source": [
76 + "Y=np.fft.fft(y)/NFFT #y(wave)를 푸리에변환한 후 1000으로 나눔\n",
77 + "Y=Y[range(math.trunc(NFFT/2))]\n",
78 + "amplitude_Hz = 2*abs(Y) #\"진폭\"을 구하기위해 abs(푸리에변환한놈)x2해줌\n",
79 + "phase_ang = np.angle(Y)*180/np.pi\n"
80 + ]
81 + },
82 + {
83 + "cell_type": "code",
84 + "execution_count": 28,
85 + "metadata": {},
86 + "outputs": [
87 + {
88 + "data": {
89 + "text/plain": [
90 + "Text(0,0.5,'y')"
91 + ]
92 + },
93 + "execution_count": 28,
94 + "metadata": {},
95 + "output_type": "execute_result"
96 + },
97 + {
98 + "data": {
99 + "image/png": "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\n",
100 + "text/plain": [
101 + "<Figure size 600x400 with 1 Axes>"
102 + ]
103 + },
104 + "metadata": {},
105 + "output_type": "display_data"
106 + }
107 + ],
108 + "source": [
109 + "# figure 1 ..................................\n",
110 + "plt.figure(num=2,dpi=100,facecolor='white')\n",
111 + "plt.subplots_adjust(hspace = 0.6, wspace = 0.3)\n",
112 + "plt.subplot(3,1,1)\n",
113 + "\n",
114 + "plt.plot(t,y,'r')\n",
115 + "plt.title('Signal FFT analysis')\n",
116 + "plt.xlabel('time($sec$)')\n",
117 + "plt.ylabel('y')\n",
118 + "#plt.xlim( 0, 0.1)"
119 + ]
120 + },
121 + {
122 + "cell_type": "code",
123 + "execution_count": 29,
124 + "metadata": {
125 + "scrolled": true
126 + },
127 + "outputs": [
128 + {
129 + "data": {
130 + "image/png": "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\n",
131 + "text/plain": [
132 + "<Figure size 432x288 with 1 Axes>"
133 + ]
134 + },
135 + "metadata": {},
136 + "output_type": "display_data"
137 + }
138 + ],
139 + "source": [
140 + "# amplitude....\n",
141 + "plt.subplot(3,1,2)\n",
142 + "\n",
143 + "# Plot single-sided amplitude spectrum.\n",
144 + "\n",
145 + "plt.plot(f0,amplitude_Hz,'r') # 2* ???\n",
146 + "plt.xlim( 0, 22050)\n",
147 + "plt.ylim( 0, 10)\n",
148 + "#plt.title('Single-Sided Amplitude Spectrum of y(t)')\n",
149 + "plt.xlabel('frequency($Hz$)')\n",
150 + "plt.ylabel('amplitude')\n",
151 + "plt.grid()"
152 + ]
153 + },
154 + {
155 + "cell_type": "code",
156 + "execution_count": 30,
157 + "metadata": {},
158 + "outputs": [
159 + {
160 + "data": {
161 + "image/png": "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\n",
162 + "text/plain": [
163 + "<Figure size 432x288 with 1 Axes>"
164 + ]
165 + },
166 + "metadata": {},
167 + "output_type": "display_data"
168 + }
169 + ],
170 + "source": [
171 + "# Phase .... <- 이해안감\n",
172 + "#plt.figure(num=2,dpi=100,facecolor='white')\n",
173 + "plt.subplot(3,1,3)\n",
174 + "plt.plot(f0,phase_ang,'r') # 2* ???\n",
175 + "plt.xlim( 0, 200)\n",
176 + "plt.ylim( -180, 180)\n",
177 + "#plt.title('Single-Sided Phase Spectrum of y(t)')\n",
178 + "plt.xlabel('frequency($Hz$)')\n",
179 + "plt.ylabel('phase($deg.$)')\n",
180 + "plt.xticks([0, 60, 120, 200])\n",
181 + "plt.yticks([-180, -90, 0, 90, 180])\n",
182 + "plt.grid()\n",
183 + "\n",
184 + "plt.savefig(\"./test_figure2.png\",dpi=300)\n",
185 + "plt.show()"
186 + ]
187 + },
188 + {
189 + "cell_type": "code",
190 + "execution_count": null,
191 + "metadata": {},
192 + "outputs": [],
193 + "source": []
194 + }
195 + ],
196 + "metadata": {
197 + "kernelspec": {
198 + "display_name": "Python 3",
199 + "language": "python",
200 + "name": "python3"
201 + },
202 + "language_info": {
203 + "codemirror_mode": {
204 + "name": "ipython",
205 + "version": 3
206 + },
207 + "file_extension": ".py",
208 + "mimetype": "text/x-python",
209 + "name": "python",
210 + "nbconvert_exporter": "python",
211 + "pygments_lexer": "ipython3",
212 + "version": "3.6.5"
213 + }
214 + },
215 + "nbformat": 4,
216 + "nbformat_minor": 2
217 +}
1 +{
2 + "cells": [
3 + {
4 + "cell_type": "code",
5 + "execution_count": 107,
6 + "metadata": {},
7 + "outputs": [],
8 + "source": [
9 + "import matplotlib.pyplot as plt\n",
10 + "import numpy as np\n",
11 + "import math\n",
12 + "import wave\n",
13 + "import pyaudio\n",
14 + "from scipy.fftpack import fft\n",
15 + "from scipy.io import wavfile # get the api\n",
16 + "\n",
17 + "CHUNK = 1024\n",
18 + "FORMAT = pyaudio.paInt16\n",
19 + "CHANNELS = 1\n",
20 + "RATE = 44100\n",
21 + "RECORD_SECONDS = 5\n",
22 + "count = 0\n"
23 + ]
24 + },
25 + {
26 + "cell_type": "code",
27 + "execution_count": 108,
28 + "metadata": {},
29 + "outputs": [
30 + {
31 + "name": "stdout",
32 + "output_type": "stream",
33 + "text": [
34 + "* recording\n",
35 + "* done recording\n"
36 + ]
37 + }
38 + ],
39 + "source": []
40 + },
41 + {
42 + "cell_type": "code",
43 + "execution_count": 131,
44 + "metadata": {},
45 + "outputs": [
46 + {
47 + "name": "stderr",
48 + "output_type": "stream",
49 + "text": [
50 + "/home/rfj/anaconda2/envs/AGIOT2/lib/python3.6/site-packages/ipykernel_launcher.py:8: RuntimeWarning: overflow encountered in short_scalars\n",
51 + " \n"
52 + ]
53 + },
54 + {
55 + "data": {
56 + "text/plain": [
57 + "-24068"
58 + ]
59 + },
60 + "execution_count": 131,
61 + "metadata": {},
62 + "output_type": "execute_result"
63 + }
64 + ],
65 + "source": [
66 + "Fs = 44032 # 샘플링 주파수\n",
67 + "T = 1/Fs # 샘플링 interval time <-? \n",
68 + "te= 5 #end of time\n",
69 + "t = np.arange(0,te,T) # Time vector (0초부터 te초까지 T간격으로 떨어져있는 배열생성)\n",
70 + "fs, data = wavfile.read('sounds/output%d.wav'% count) # load the data\n",
71 + "y = data.T"
72 + ]
73 + },
74 + {
75 + "cell_type": "code",
76 + "execution_count": 128,
77 + "metadata": {},
78 + "outputs": [
79 + {
80 + "ename": "ValueError",
81 + "evalue": "x and y must have same first dimension, but have shapes (220160,) and (1,)",
82 + "output_type": "error",
83 + "traceback": [
84 + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
85 + "\u001b[0;31mValueError\u001b[0m Traceback (most recent call last)",
86 + "\u001b[0;32m<ipython-input-128-0aaa3ccbf52c>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0mplt\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfigure\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnum\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mdpi\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m100\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mfacecolor\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'white'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0mplt\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mplot\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mt\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0my\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m'r'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 3\u001b[0m \u001b[0mplt\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mxlim\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m5\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0mplt\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mxlabel\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'time($sec$)'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0mplt\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mylabel\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'y'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
87 + "\u001b[0;32m~/anaconda2/envs/AGIOT2/lib/python3.6/site-packages/matplotlib/pyplot.py\u001b[0m in \u001b[0;36mplot\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m 3356\u001b[0m mplDeprecation)\n\u001b[1;32m 3357\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 3358\u001b[0;31m \u001b[0mret\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0max\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mplot\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 3359\u001b[0m \u001b[0;32mfinally\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3360\u001b[0m \u001b[0max\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_hold\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mwashold\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
88 + "\u001b[0;32m~/anaconda2/envs/AGIOT2/lib/python3.6/site-packages/matplotlib/__init__.py\u001b[0m in \u001b[0;36minner\u001b[0;34m(ax, *args, **kwargs)\u001b[0m\n\u001b[1;32m 1853\u001b[0m \u001b[0;34m\"the Matplotlib list!)\"\u001b[0m \u001b[0;34m%\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0mlabel_namer\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfunc\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__name__\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1854\u001b[0m RuntimeWarning, stacklevel=2)\n\u001b[0;32m-> 1855\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mfunc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0max\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1856\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1857\u001b[0m inner.__doc__ = _add_data_doc(inner.__doc__,\n",
89 + "\u001b[0;32m~/anaconda2/envs/AGIOT2/lib/python3.6/site-packages/matplotlib/axes/_axes.py\u001b[0m in \u001b[0;36mplot\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m 1525\u001b[0m \u001b[0mkwargs\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mcbook\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnormalize_kwargs\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0m_alias_map\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1526\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1527\u001b[0;31m \u001b[0;32mfor\u001b[0m \u001b[0mline\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_get_lines\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1528\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0madd_line\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mline\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1529\u001b[0m \u001b[0mlines\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mappend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mline\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
90 + "\u001b[0;32m~/anaconda2/envs/AGIOT2/lib/python3.6/site-packages/matplotlib/axes/_base.py\u001b[0m in \u001b[0;36m_grab_next_args\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m 404\u001b[0m \u001b[0mthis\u001b[0m \u001b[0;34m+=\u001b[0m \u001b[0margs\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 405\u001b[0m \u001b[0margs\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0margs\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 406\u001b[0;31m \u001b[0;32mfor\u001b[0m \u001b[0mseg\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_plot_args\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mthis\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 407\u001b[0m \u001b[0;32myield\u001b[0m \u001b[0mseg\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 408\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
91 + "\u001b[0;32m~/anaconda2/envs/AGIOT2/lib/python3.6/site-packages/matplotlib/axes/_base.py\u001b[0m in \u001b[0;36m_plot_args\u001b[0;34m(self, tup, kwargs)\u001b[0m\n\u001b[1;32m 381\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0my\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mindex_of\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtup\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m-\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 382\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 383\u001b[0;31m \u001b[0mx\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0my\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_xy_from_xy\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0my\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 384\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 385\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcommand\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;34m'plot'\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
92 + "\u001b[0;32m~/anaconda2/envs/AGIOT2/lib/python3.6/site-packages/matplotlib/axes/_base.py\u001b[0m in \u001b[0;36m_xy_from_xy\u001b[0;34m(self, x, y)\u001b[0m\n\u001b[1;32m 240\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mshape\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m!=\u001b[0m \u001b[0my\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mshape\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 241\u001b[0m raise ValueError(\"x and y must have same first dimension, but \"\n\u001b[0;32m--> 242\u001b[0;31m \"have shapes {} and {}\".format(x.shape, y.shape))\n\u001b[0m\u001b[1;32m 243\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mndim\u001b[0m \u001b[0;34m>\u001b[0m \u001b[0;36m2\u001b[0m \u001b[0;32mor\u001b[0m \u001b[0my\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mndim\u001b[0m \u001b[0;34m>\u001b[0m \u001b[0;36m2\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 244\u001b[0m raise ValueError(\"x and y can be no greater than 2-D, but have \"\n",
93 + "\u001b[0;31mValueError\u001b[0m: x and y must have same first dimension, but have shapes (220160,) and (1,)"
94 + ]
95 + },
96 + {
97 + "data": {
98 + "image/png": "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nlGse/7WW2/p4MGDWrZsWWzsxIkTkqSUlBS98cYbmjt37vguepJL5O88MzNTqamp8nq9sbGcnBz19PRoYGBAaWlp47rmyS6RPV+9erVKSkp02223SZIuu+wyffDBB7r99ttVW1s7pj8jjdGfP1NSUjR9+vRTvp0J/1fhZ76TL5E9l6QNGzbovvvu03PPPae8vLzxXuYZxbrn8+bN0+uvv67Ozs7Y5YYbbtDVV1+tzs5OhUKhZC190krk73zhwoXav39/LNQk6c0331RmZibhcAoS2fNjx44NCwSv1yv30Rv6x22tZ6vRnj/z8vKUmpp66jdkenvlODn50Z7m5ma3b98+V1FR4c4991x38OBB55xzJSUlce/UfeWVV5zX63X333+/6+rqcvfffz8f1TSy7vkDDzzg0tLS3Pbt292hQ4dil6NHj07UQ5h0rHv+SXzaws6655FIxJ133nnuzjvvdG+88YZ79tln3YwZM9yPf/zjiXoIk451z9esWeOmTp3qtm7d6g4cOOB27tzp5s6d62666aaJegiTytGjR11HR4fr6OhwktzGjRtdR0dH7KOx1dXVrqSkJDb/5Ec1Kysr3b59+1xzc/Pk/aimc85t3rzZZWdnu7S0NDd//nz34osvxv7bVVdd5VauXBk3/7e//a275JJLXGpqqps3b57bsWNHklc8+Vn2PDs720kadlmzZk3yFz6JWf/O/3/EQ2Kse97W1uby8/Odz+dzc+bMcevXr3eDg4NJXvXkZtnz48ePu7Vr17q5c+c6v9/vQqGQ++53v+v+85//TMDKJ58XXnhhxP83n9zjlStXuquuuirumF27drkrr7zSpaWluYsvvtg1Njaa75ef5AYAACYT/p4HAAAwuRAPAADAhHgAAAAmxAMAADAhHgAAgAnxAAAATIgHAABgQjwAAAAT4gEAAJgQDwAAwIR4AAAAJsQDAAAw+T8YVdVPsQpR6wAAAABJRU5ErkJggg==\n",
99 + "text/plain": [
100 + "<Figure size 600x400 with 1 Axes>"
101 + ]
102 + },
103 + "metadata": {},
104 + "output_type": "display_data"
105 + }
106 + ],
107 + "source": [
108 + "plt.figure(num=1,dpi=100,facecolor='white')\n",
109 + "plt.plot(t,y,'r')\n",
110 + "plt.xlim(0, 5)\n",
111 + "plt.xlabel('time($sec$)')\n",
112 + "plt.ylabel('y')\n",
113 + "plt.savefig(\"sounds/test_figure%d.png\"%count,dpi=300)"
114 + ]
115 + },
116 + {
117 + "cell_type": "code",
118 + "execution_count": 105,
119 + "metadata": {},
120 + "outputs": [],
121 + "source": [
122 + "'''\n",
123 + "FFT 계산\n",
124 + "양측파대 설명 = http://linecard.tistory.com/46\n",
125 + "우리는 양측파대 안쓰고 단측파대를 쓰나보지..?\n",
126 + "'''\n",
127 + "\n",
128 + "n= len(y) #신호의 길이 (FFT의 샘플개수 결정) (1000)\n",
129 + "NFFT = n # C++ 에서는 NFFT = 2^nextpow2(length(y)) 해줘야하는데 파이썬에서는 알아서해줌 (FFT의 샘플개수)\n",
130 + "\n",
131 + "k=np.arange(NFFT) #NFFT 샘플개수만큼의 배열 (1000개의 원소)\n",
132 + "\n",
133 + "f0 = k*Fs/NFFT # <- NFFT 샘플개수만큼의 배열 양측파대 (double side frequency) 범위\n",
134 + "\n",
135 + "f0 = f0[range(math.trunc(NFFT/2))]\n",
136 + "\n",
137 + "Y=np.fft.fft(y)/NFFT #y(wave)를 푸리에변환한 후 1000으로 나눔\n",
138 + "Y=Y[range(math.trunc(NFFT/2))]\n",
139 + "#amplitude_Hz = 2*abs(Y) #\"진폭\"을 구하기위해 abs(푸리에변환한놈)x2해줌\n",
140 + "amplitude_Hz = abs(Y) #\"진폭\"을 구하기위해 abs(푸리에변환한놈)x2해줌\n",
141 + "phase_ang = np.angle(Y)*180/np.pi"
142 + ]
143 + },
144 + {
145 + "cell_type": "code",
146 + "execution_count": 106,
147 + "metadata": {
148 + "scrolled": false
149 + },
150 + "outputs": [
151 + {
152 + "data": {
153 + "image/png": "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\n",
154 + "text/plain": [
155 + "<Figure size 432x288 with 1 Axes>"
156 + ]
157 + },
158 + "metadata": {},
159 + "output_type": "display_data"
160 + }
161 + ],
162 + "source": [
163 + "# amplitude....\n",
164 + "plt.subplot(3,1,2)\n",
165 + "\n",
166 + "# Plot single-sided amplitude spectrum.\n",
167 + "\n",
168 + "plt.plot(f0,amplitude_Hz,'r') # 2* ???\n",
169 + "plt.xticks(np.arange(0,20000,2000))\n",
170 + "plt.xlim( 0, 20000)\n",
171 + "plt.ylim( 0, 50)\n",
172 + "#plt.title('Single-Sided Amplitude Spectrum of y(t)')\n",
173 + "plt.xlabel('frequency($Hz$)')\n",
174 + "plt.ylabel('amplitude')\n",
175 + "plt.grid()\n",
176 + "plt.savefig(\"sounds/test_figure%d-fft.png\"%count,dpi=300)\n",
177 + "\n",
178 + "\n",
179 + "print(\"%d번 음성 FFT완료\"%count)\n",
180 + "count = count + 1\n"
181 + ]
182 + },
183 + {
184 + "cell_type": "code",
185 + "execution_count": 102,
186 + "metadata": {},
187 + "outputs": [
188 + {
189 + "data": {
190 + "text/plain": [
191 + "4"
192 + ]
193 + },
194 + "execution_count": 102,
195 + "metadata": {},
196 + "output_type": "execute_result"
197 + }
198 + ],
199 + "source": [
200 + "'''\n",
201 + "Fs = 2000 # 샘플링 주파수\n",
202 + "T = 1/Fs # 샘플링 interval time <-? \n",
203 + "te= 5 #end of time\n",
204 + "t = np.arange(0,te,T) # Time vector (0초부터 te초까지 T간격으로 떨어져있는 배열생성)\n",
205 + "noise = np.random.normal(0,0.05,len(t)) \n",
206 + "x=0.6*np.cos(2*np.pi*60*t + np.pi/2) + np.cos(2*np.pi*120*t)\n",
207 + "y= x+noise\n",
208 + "\n",
209 + "'''\n",
210 + "'''\n",
211 + "# figure 1 ..................................\n",
212 + "plt.figure(num=2,dpi=100,facecolor='white')\n",
213 + "plt.subplots_adjust(hspace = 0.6, wspace = 0.3)\n",
214 + "plt.subplot(3,1,1)\n",
215 + "\n",
216 + "plt.plot(t,y,'r')\n",
217 + "plt.title('Signal FFT analysis')\n",
218 + "plt.xlabel('time($sec$)')\n",
219 + "plt.ylabel('y')\n",
220 + "\n",
221 + "#plt.xlim( 0, 0.1)\n",
222 + "\n",
223 + "\n",
224 + "# Phase .... <- 이해안감\n",
225 + "#plt.figure(num=2,dpi=100,facecolor='white')\n",
226 + "plt.subplot(3,1,3)\n",
227 + "plt.plot(f0,phase_ang,'r') # 2* ???\n",
228 + "plt.xlim( 0, 200)\n",
229 + "plt.ylim( -180, 180)\n",
230 + "#plt.title('Single-Sided Phase Spectrum of y(t)')\n",
231 + "plt.xlabel('frequency($Hz$)')\n",
232 + "plt.ylabel('phase($deg.$)')\n",
233 + "plt.xticks([0, 60, 120, 200])\n",
234 + "plt.yticks([-180, -90, 0, 90, 180])\n",
235 + "plt.grid()\n",
236 + "\n",
237 + "plt.savefig(\"./test_figure2.png\",dpi=300)\n",
238 + "plt.show()\n",
239 + "\n",
240 + "'''"
241 + ]
242 + },
243 + {
244 + "cell_type": "code",
245 + "execution_count": null,
246 + "metadata": {},
247 + "outputs": [],
248 + "source": []
249 + }
250 + ],
251 + "metadata": {
252 + "kernelspec": {
253 + "display_name": "Python 3",
254 + "language": "python",
255 + "name": "python3"
256 + },
257 + "language_info": {
258 + "codemirror_mode": {
259 + "name": "ipython",
260 + "version": 3
261 + },
262 + "file_extension": ".py",
263 + "mimetype": "text/x-python",
264 + "name": "python",
265 + "nbconvert_exporter": "python",
266 + "pygments_lexer": "ipython3",
267 + "version": "3.6.5"
268 + }
269 + },
270 + "nbformat": 4,
271 + "nbformat_minor": 2
272 +}
1 +{
2 + "cells": [
3 + {
4 + "cell_type": "code",
5 + "execution_count": 3,
6 + "metadata": {},
7 + "outputs": [],
8 + "source": [
9 + "import matplotlib.pyplot as plt\n",
10 + "from scipy.fftpack import fft\n",
11 + "from scipy.io import wavfile # get the api"
12 + ]
13 + },
14 + {
15 + "cell_type": "code",
16 + "execution_count": 4,
17 + "metadata": {
18 + "scrolled": false
19 + },
20 + "outputs": [
21 + {
22 + "ename": "TypeError",
23 + "evalue": "'numpy.int16' object is not iterable",
24 + "output_type": "error",
25 + "traceback": [
26 + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
27 + "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)",
28 + "\u001b[0;32m<ipython-input-4-c176e6e452f3>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0mfs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdata\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mwavfile\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mread\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'1.wav'\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# load the data\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0ma\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mdata\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mT\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;31m# this is a two channel soundtrack, I get the first track\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 3\u001b[0;31m \u001b[0mb\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mele\u001b[0m\u001b[0;34m/\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m**\u001b[0m\u001b[0;36m8.\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m-\u001b[0m\u001b[0;36m1\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mele\u001b[0m \u001b[0;32min\u001b[0m \u001b[0ma\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;31m# this is 8-bit track, b is now normalized on [-1,1)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 4\u001b[0m \u001b[0mc\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mfft\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mb\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# calculate fourier transform (complex numbers list)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0md\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mc\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m/\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# you only need half of the fft list (real signal symmetry)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
29 + "\u001b[0;31mTypeError\u001b[0m: 'numpy.int16' object is not iterable"
30 + ]
31 + }
32 + ],
33 + "source": [
34 + "fs, data = wavfile.read('1.wav') # load the data\n",
35 + "a = data.T[0] # this is a two channel soundtrack, I get the first track\n",
36 + "b=[(ele/2**8.)*2-1 for ele in a] # this is 8-bit track, b is now normalized on [-1,1)\n",
37 + "c = fft(b) # calculate fourier transform (complex numbers list)\n",
38 + "d = int(len(c)/2) # you only need half of the fft list (real signal symmetry)\n",
39 + "plt.plot(abs(c[:(d-1)]),'r') \n",
40 + "plt.show()"
41 + ]
42 + },
43 + {
44 + "cell_type": "code",
45 + "execution_count": 16,
46 + "metadata": {},
47 + "outputs": [],
48 + "source": [
49 + "#wav파일 프린트 할줄알아야함 \n",
50 + "#(채널 : 모노라면 1, 스테레오라면 2\n",
51 + "\n"
52 + ]
53 + },
54 + {
55 + "cell_type": "code",
56 + "execution_count": null,
57 + "metadata": {},
58 + "outputs": [],
59 + "source": []
60 + }
61 + ],
62 + "metadata": {
63 + "kernelspec": {
64 + "display_name": "Python 3",
65 + "language": "python",
66 + "name": "python3"
67 + },
68 + "language_info": {
69 + "codemirror_mode": {
70 + "name": "ipython",
71 + "version": 3
72 + },
73 + "file_extension": ".py",
74 + "mimetype": "text/x-python",
75 + "name": "python",
76 + "nbconvert_exporter": "python",
77 + "pygments_lexer": "ipython3",
78 + "version": "3.6.5"
79 + }
80 + },
81 + "nbformat": 4,
82 + "nbformat_minor": 2
83 +}
1 +{
2 + "cells": [
3 + {
4 + "cell_type": "code",
5 + "execution_count": 2,
6 + "metadata": {},
7 + "outputs": [],
8 + "source": [
9 + "import math\n",
10 + "import wave\n",
11 + "import sys\n",
12 + "import struct\n"
13 + ]
14 + },
15 + {
16 + "cell_type": "code",
17 + "execution_count": 3,
18 + "metadata": {},
19 + "outputs": [
20 + {
21 + "ename": "ValueError",
22 + "evalue": "invalid literal for int() with base 10: '/run/user/1000/jupyter/kernel-6454a929-4509-4b51-949d-f1c910f7ce09.json'",
23 + "output_type": "error",
24 + "traceback": [
25 + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
26 + "\u001b[0;31mValueError\u001b[0m Traceback (most recent call last)",
27 + "\u001b[0;32m<ipython-input-3-cc8beb2556b6>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m()\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0msample_rate\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mfp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mgetframerate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0mtotal_num_samps\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mfp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mgetnframes\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 5\u001b[0;31m \u001b[0mfft_length\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msys\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0margv\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 6\u001b[0m \u001b[0mnum_fft\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0mtotal_num_samps\u001b[0m \u001b[0;34m/\u001b[0m \u001b[0mfft_length\u001b[0m \u001b[0;34m)\u001b[0m \u001b[0;34m-\u001b[0m \u001b[0;36m2\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
28 + "\u001b[0;31mValueError\u001b[0m: invalid literal for int() with base 10: '/run/user/1000/jupyter/kernel-6454a929-4509-4b51-949d-f1c910f7ce09.json'"
29 + ]
30 + }
31 + ],
32 + "source": [
33 + "# 웨이브 파일을 열어라\n",
34 + "fp = wave.open('birdsound.wav',\"rb\")\n",
35 + "sample_rate = fp.getframerate()\n",
36 + "total_num_samps = fp.getnframes()\n",
37 + "fft_length = int(sys.argv[2])\n",
38 + "num_fft = (total_num_samps / fft_length ) - 2"
39 + ]
40 + },
41 + {
42 + "cell_type": "code",
43 + "execution_count": null,
44 + "metadata": {},
45 + "outputs": [],
46 + "source": [
47 + "# 임시로 사용할 작업 배열을 만들어라\n",
48 + "temp = zeros((num_fft,fft_length),Float)"
49 + ]
50 + },
51 + {
52 + "cell_type": "code",
53 + "execution_count": null,
54 + "metadata": {},
55 + "outputs": [],
56 + "source": [
57 + "# 파일로부터 데이터를 읽어 들여라\n",
58 + "for i in range(num_fft):\n",
59 + " tempb = fp.readframes(fft_length);\n",
60 + " temp[i,:] = array(struct.unpack(\"%dB\"%(fft_length), \\\n",
61 + " tempb),Float) - 128.0\n",
62 + "fp.close()"
63 + ]
64 + },
65 + {
66 + "cell_type": "code",
67 + "execution_count": null,
68 + "metadata": {},
69 + "outputs": [],
70 + "source": [
71 + "# 데이터를 창틀화하라\n",
72 + "temp = temp * hamming(fft_length)\n",
73 + "\n",
74 + "# FFT를 사용하여 변환하라, 파워를 반환하라\n",
75 + "freq_pwr = 10*log10(1e-20+abs(real_fft(temp,fft_length))"
76 + ]
77 + },
78 + {
79 + "cell_type": "code",
80 + "execution_count": null,
81 + "metadata": {},
82 + "outputs": [],
83 + "source": [
84 + "# 결과를 도표하라\n",
85 + "n_out_pts = (fft_length / 2) + 1\n",
86 + "y_axis = 0.5*float(sample_rate) / n_out_pts * \\\n",
87 + " arange(n_out_pts)\n",
88 + "x_axis = (total_num_samps / float(sample_rate)) / \\\n",
89 + " num_fft * arange(num_fft)\n",
90 + "setvar(\"X\",\"Time (sec)\")\n",
91 + "setvar(\"Y\",\"Frequency (Hertz)\")\n",
92 + "conshade(freq_pwr,x_axis,y_axis)\n",
93 + "disfin()"
94 + ]
95 + }
96 + ],
97 + "metadata": {
98 + "kernelspec": {
99 + "display_name": "Python 3",
100 + "language": "python",
101 + "name": "python3"
102 + },
103 + "language_info": {
104 + "codemirror_mode": {
105 + "name": "ipython",
106 + "version": 3
107 + },
108 + "file_extension": ".py",
109 + "mimetype": "text/x-python",
110 + "name": "python",
111 + "nbconvert_exporter": "python",
112 + "pygments_lexer": "ipython3",
113 + "version": "3.6.5"
114 + }
115 + },
116 + "nbformat": 4,
117 + "nbformat_minor": 2
118 +}
This diff could not be displayed because it is too large.
1 +{
2 + "cells": [
3 + {
4 + "cell_type": "code",
5 + "execution_count": 2,
6 + "metadata": {},
7 + "outputs": [],
8 + "source": [
9 + "import wave\n",
10 + "import pyaudio"
11 + ]
12 + },
13 + {
14 + "cell_type": "code",
15 + "execution_count": 3,
16 + "metadata": {},
17 + "outputs": [],
18 + "source": [
19 + "def play_file(fname):\n",
20 + " #오디오 객체 생성\n",
21 + " wf = wave.open('output.wav','rb') # wave파일 할당해준 객체\n",
22 + " p = pyaudio.PyAudio() #파이오디오 할당해준 객체\n",
23 + " chunk = 1024\n",
24 + " \n",
25 + " #stream = pyaudio로 open 하는것\n",
26 + " stream = p.open(format=p.get_format_from_width(wf.getsampwidth()),\n",
27 + " channels=wf.getnchannels(),\n",
28 + " rate=wf.getframerate(),\n",
29 + " output=True)\n",
30 + " \n",
31 + " #데이터 wav파일에서 읽기\n",
32 + " data = wf.readframes(chunk)\n",
33 + " \n",
34 + " #읽은 데이터 있는동안 \n",
35 + " while data !='':\n",
36 + " stream.write(data) #스트림에 데이터 쓰기 \n",
37 + " data = wf.readframes(chunk) #데이터 wav파일에서 다시읽기\n",
38 + " \n",
39 + " #객체 닫아주기\n",
40 + " stream.close()\n",
41 + " p.terminate()\n",
42 + " "
43 + ]
44 + },
45 + {
46 + "cell_type": "code",
47 + "execution_count": null,
48 + "metadata": {},
49 + "outputs": [],
50 + "source": [
51 + "play_file('output.wav')"
52 + ]
53 + },
54 + {
55 + "cell_type": "code",
56 + "execution_count": null,
57 + "metadata": {},
58 + "outputs": [],
59 + "source": []
60 + }
61 + ],
62 + "metadata": {
63 + "kernelspec": {
64 + "display_name": "Python 3",
65 + "language": "python",
66 + "name": "python3"
67 + },
68 + "language_info": {
69 + "codemirror_mode": {
70 + "name": "ipython",
71 + "version": 3
72 + },
73 + "file_extension": ".py",
74 + "mimetype": "text/x-python",
75 + "name": "python",
76 + "nbconvert_exporter": "python",
77 + "pygments_lexer": "ipython3",
78 + "version": "3.6.5"
79 + }
80 + },
81 + "nbformat": 4,
82 + "nbformat_minor": 2
83 +}
1 +{
2 + "cells": [
3 + {
4 + "cell_type": "code",
5 + "execution_count": 107,
6 + "metadata": {},
7 + "outputs": [],
8 + "source": [
9 + "import matplotlib.pyplot as plt\n",
10 + "import numpy as np\n",
11 + "import math\n",
12 + "import wave\n",
13 + "import pyaudio\n",
14 + "from scipy.fftpack import fft\n",
15 + "from scipy.io import wavfile # get the api\n",
16 + "\n",
17 + "CHUNK = 1024\n",
18 + "FORMAT = pyaudio.paInt16\n",
19 + "CHANNELS = 1\n",
20 + "RATE = 44100\n",
21 + "RECORD_SECONDS = 5\n",
22 + "count = 0"
23 + ]
24 + },
25 + {
26 + "cell_type": "code",
27 + "execution_count": null,
28 + "metadata": {},
29 + "outputs": [],
30 + "source": [
31 + "\n",
32 + "import RPi.GPIO as GPIO\n",
33 + "import time\n",
34 + "\n",
35 + "#GPIO SETUP\n",
36 + "channel = 17\n",
37 + "GPIO.setmode(GPIO.BCM)\n",
38 + "GPIO.setup(channel, GPIO.IN)\n",
39 + "\n",
40 + "def callback(channel):\n",
41 + " if GPIO.input(channel):\n",
42 + " print \"Sound Detected!\"\n",
43 + " else:\n",
44 + " print \"Sound Detected!\"\n",
45 + "\n",
46 + "GPIO.add_event_detect(channel, GPIO.BOTH, bouncetime=300) # let us know when the pin goes HIGH or LOW\n",
47 + "GPIO.add_event_callback(channel, callback) # assign function to GPIO PIN, Run function on change\n",
48 + "\n",
49 + "# infinite loop\n",
50 + "while True:\n",
51 + " time.sleep(1)"
52 + ]
53 + },
54 + {
55 + "cell_type": "code",
56 + "execution_count": 108,
57 + "metadata": {},
58 + "outputs": [
59 + {
60 + "name": "stdout",
61 + "output_type": "stream",
62 + "text": [
63 + "* recording\n",
64 + "* done recording\n"
65 + ]
66 + }
67 + ],
68 + "source": [
69 + "\n",
70 + "WAVE_OUTPUT_FILENAME = \"sounds/output%d.wav\"% count\n",
71 + "\n",
72 + "p = pyaudio.PyAudio()\n",
73 + "\n",
74 + "stream = p.open(format=FORMAT,\n",
75 + " channels=CHANNELS,\n",
76 + " rate=RATE,\n",
77 + " input=True,\n",
78 + " frames_per_buffer=CHUNK)\n",
79 + "\n",
80 + "print(\"* recording\")\n",
81 + "\n",
82 + "frames = []\n",
83 + "\n",
84 + "for i in range(0, int(RATE / CHUNK * RECORD_SECONDS)):\n",
85 + " data = stream.read(CHUNK)\n",
86 + " frames.append(data)\n",
87 + "\n",
88 + "print(\"* done recording\")\n",
89 + "\n",
90 + "stream.stop_stream()\n",
91 + "stream.close()\n",
92 + "p.terminate()\n",
93 + "\n",
94 + "wf = wave.open(WAVE_OUTPUT_FILENAME, 'wb')\n",
95 + "wf.setnchannels(CHANNELS)\n",
96 + "wf.setsampwidth(p.get_sample_size(FORMAT))\n",
97 + "wf.setframerate(RATE)\n",
98 + "wf.writeframes(b''.join(frames))\n",
99 + "wf.close()\n"
100 + ]
101 + },
102 + {
103 + "cell_type": "code",
104 + "execution_count": 131,
105 + "metadata": {},
106 + "outputs": [
107 + {
108 + "name": "stderr",
109 + "output_type": "stream",
110 + "text": [
111 + "/home/rfj/anaconda2/envs/AGIOT2/lib/python3.6/site-packages/ipykernel_launcher.py:8: RuntimeWarning: overflow encountered in short_scalars\n",
112 + " \n"
113 + ]
114 + },
115 + {
116 + "data": {
117 + "text/plain": [
118 + "-24068"
119 + ]
120 + },
121 + "execution_count": 131,
122 + "metadata": {},
123 + "output_type": "execute_result"
124 + }
125 + ],
126 + "source": [
127 + "Fs = 44032 # 샘플링 주파수\n",
128 + "T = 1/Fs # 샘플링 interval time <-? \n",
129 + "te= 5 #end of time\n",
130 + "t = np.arange(0,te,T) # Time vector (0초부터 te초까지 T간격으로 떨어져있는 배열생성)\n",
131 + "fs, data = wavfile.read('sounds/output%d.wav'% count) # load the data\n",
132 + "y = data.T"
133 + ]
134 + },
135 + {
136 + "cell_type": "code",
137 + "execution_count": 128,
138 + "metadata": {},
139 + "outputs": [
140 + {
141 + "ename": "ValueError",
142 + "evalue": "x and y must have same first dimension, but have shapes (220160,) and (1,)",
143 + "output_type": "error",
144 + "traceback": [
145 + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
146 + "\u001b[0;31mValueError\u001b[0m Traceback (most recent call last)",
147 + "\u001b[0;32m<ipython-input-128-0aaa3ccbf52c>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0mplt\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfigure\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnum\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mdpi\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m100\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mfacecolor\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'white'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0mplt\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mplot\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mt\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0my\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m'r'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 3\u001b[0m \u001b[0mplt\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mxlim\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m5\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0mplt\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mxlabel\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'time($sec$)'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0mplt\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mylabel\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'y'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
148 + "\u001b[0;32m~/anaconda2/envs/AGIOT2/lib/python3.6/site-packages/matplotlib/pyplot.py\u001b[0m in \u001b[0;36mplot\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m 3356\u001b[0m mplDeprecation)\n\u001b[1;32m 3357\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 3358\u001b[0;31m \u001b[0mret\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0max\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mplot\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 3359\u001b[0m \u001b[0;32mfinally\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3360\u001b[0m \u001b[0max\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_hold\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mwashold\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
149 + "\u001b[0;32m~/anaconda2/envs/AGIOT2/lib/python3.6/site-packages/matplotlib/__init__.py\u001b[0m in \u001b[0;36minner\u001b[0;34m(ax, *args, **kwargs)\u001b[0m\n\u001b[1;32m 1853\u001b[0m \u001b[0;34m\"the Matplotlib list!)\"\u001b[0m \u001b[0;34m%\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0mlabel_namer\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfunc\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__name__\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1854\u001b[0m RuntimeWarning, stacklevel=2)\n\u001b[0;32m-> 1855\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mfunc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0max\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1856\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1857\u001b[0m inner.__doc__ = _add_data_doc(inner.__doc__,\n",
150 + "\u001b[0;32m~/anaconda2/envs/AGIOT2/lib/python3.6/site-packages/matplotlib/axes/_axes.py\u001b[0m in \u001b[0;36mplot\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m 1525\u001b[0m \u001b[0mkwargs\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mcbook\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnormalize_kwargs\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0m_alias_map\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1526\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1527\u001b[0;31m \u001b[0;32mfor\u001b[0m \u001b[0mline\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_get_lines\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1528\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0madd_line\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mline\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1529\u001b[0m \u001b[0mlines\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mappend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mline\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
151 + "\u001b[0;32m~/anaconda2/envs/AGIOT2/lib/python3.6/site-packages/matplotlib/axes/_base.py\u001b[0m in \u001b[0;36m_grab_next_args\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m 404\u001b[0m \u001b[0mthis\u001b[0m \u001b[0;34m+=\u001b[0m \u001b[0margs\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 405\u001b[0m \u001b[0margs\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0margs\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 406\u001b[0;31m \u001b[0;32mfor\u001b[0m \u001b[0mseg\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_plot_args\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mthis\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 407\u001b[0m \u001b[0;32myield\u001b[0m \u001b[0mseg\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 408\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
152 + "\u001b[0;32m~/anaconda2/envs/AGIOT2/lib/python3.6/site-packages/matplotlib/axes/_base.py\u001b[0m in \u001b[0;36m_plot_args\u001b[0;34m(self, tup, kwargs)\u001b[0m\n\u001b[1;32m 381\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0my\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mindex_of\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtup\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m-\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 382\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 383\u001b[0;31m \u001b[0mx\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0my\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_xy_from_xy\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0my\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 384\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 385\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcommand\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;34m'plot'\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
153 + "\u001b[0;32m~/anaconda2/envs/AGIOT2/lib/python3.6/site-packages/matplotlib/axes/_base.py\u001b[0m in \u001b[0;36m_xy_from_xy\u001b[0;34m(self, x, y)\u001b[0m\n\u001b[1;32m 240\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mshape\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m!=\u001b[0m \u001b[0my\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mshape\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 241\u001b[0m raise ValueError(\"x and y must have same first dimension, but \"\n\u001b[0;32m--> 242\u001b[0;31m \"have shapes {} and {}\".format(x.shape, y.shape))\n\u001b[0m\u001b[1;32m 243\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mndim\u001b[0m \u001b[0;34m>\u001b[0m \u001b[0;36m2\u001b[0m \u001b[0;32mor\u001b[0m \u001b[0my\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mndim\u001b[0m \u001b[0;34m>\u001b[0m \u001b[0;36m2\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 244\u001b[0m raise ValueError(\"x and y can be no greater than 2-D, but have \"\n",
154 + "\u001b[0;31mValueError\u001b[0m: x and y must have same first dimension, but have shapes (220160,) and (1,)"
155 + ]
156 + },
157 + {
158 + "data": {
159 + "image/png": "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nlGse/7WW2/p4MGDWrZsWWzsxIkTkqSUlBS98cYbmjt37vguepJL5O88MzNTqamp8nq9sbGcnBz19PRoYGBAaWlp47rmyS6RPV+9erVKSkp02223SZIuu+wyffDBB7r99ttVW1s7pj8jjdGfP1NSUjR9+vRTvp0J/1fhZ76TL5E9l6QNGzbovvvu03PPPae8vLzxXuYZxbrn8+bN0+uvv67Ozs7Y5YYbbtDVV1+tzs5OhUKhZC190krk73zhwoXav39/LNQk6c0331RmZibhcAoS2fNjx44NCwSv1yv30Rv6x22tZ6vRnj/z8vKUmpp66jdkenvlODn50Z7m5ma3b98+V1FR4c4991x38OBB55xzJSUlce/UfeWVV5zX63X333+/6+rqcvfffz8f1TSy7vkDDzzg0tLS3Pbt292hQ4dil6NHj07UQ5h0rHv+SXzaws6655FIxJ133nnuzjvvdG+88YZ79tln3YwZM9yPf/zjiXoIk451z9esWeOmTp3qtm7d6g4cOOB27tzp5s6d62666aaJegiTytGjR11HR4fr6OhwktzGjRtdR0dH7KOx1dXVrqSkJDb/5Ec1Kysr3b59+1xzc/Pk/aimc85t3rzZZWdnu7S0NDd//nz34osvxv7bVVdd5VauXBk3/7e//a275JJLXGpqqps3b57bsWNHklc8+Vn2PDs720kadlmzZk3yFz6JWf/O/3/EQ2Kse97W1uby8/Odz+dzc+bMcevXr3eDg4NJXvXkZtnz48ePu7Vr17q5c+c6v9/vQqGQ++53v+v+85//TMDKJ58XXnhhxP83n9zjlStXuquuuirumF27drkrr7zSpaWluYsvvtg1Njaa75ef5AYAACYT/p4HAAAwuRAPAADAhHgAAAAmxAMAADAhHgAAgAnxAAAATIgHAABgQjwAAAAT4gEAAJgQDwAAwIR4AAAAJsQDAAAw+T8YVdVPsQpR6wAAAABJRU5ErkJggg==\n",
160 + "text/plain": [
161 + "<Figure size 600x400 with 1 Axes>"
162 + ]
163 + },
164 + "metadata": {},
165 + "output_type": "display_data"
166 + }
167 + ],
168 + "source": [
169 + "plt.figure(num=1,dpi=100,facecolor='white')\n",
170 + "plt.plot(t,y,'r')\n",
171 + "plt.xlim(0, 5)\n",
172 + "plt.xlabel('time($sec$)')\n",
173 + "plt.ylabel('y')\n",
174 + "plt.savefig(\"sounds/test_figure%d.png\"%count,dpi=300)"
175 + ]
176 + },
177 + {
178 + "cell_type": "code",
179 + "execution_count": 105,
180 + "metadata": {},
181 + "outputs": [],
182 + "source": [
183 + "'''\n",
184 + "FFT 계산\n",
185 + "양측파대 설명 = http://linecard.tistory.com/46\n",
186 + "우리는 양측파대 안쓰고 단측파대를 쓰나보지..?\n",
187 + "'''\n",
188 + "\n",
189 + "n= len(y) #신호의 길이 (FFT의 샘플개수 결정) (1000)\n",
190 + "NFFT = n # C++ 에서는 NFFT = 2^nextpow2(length(y)) 해줘야하는데 파이썬에서는 알아서해줌 (FFT의 샘플개수)\n",
191 + "\n",
192 + "k=np.arange(NFFT) #NFFT 샘플개수만큼의 배열 (1000개의 원소)\n",
193 + "\n",
194 + "f0 = k*Fs/NFFT # <- NFFT 샘플개수만큼의 배열 양측파대 (double side frequency) 범위\n",
195 + "\n",
196 + "f0 = f0[range(math.trunc(NFFT/2))]\n",
197 + "\n",
198 + "Y=np.fft.fft(y)/NFFT #y(wave)를 푸리에변환한 후 1000으로 나눔\n",
199 + "Y=Y[range(math.trunc(NFFT/2))]\n",
200 + "#amplitude_Hz = 2*abs(Y) #\"진폭\"을 구하기위해 abs(푸리에변환한놈)x2해줌\n",
201 + "amplitude_Hz = abs(Y) #\"진폭\"을 구하기위해 abs(푸리에변환한놈)x2해줌\n",
202 + "phase_ang = np.angle(Y)*180/np.pi"
203 + ]
204 + },
205 + {
206 + "cell_type": "code",
207 + "execution_count": 106,
208 + "metadata": {
209 + "scrolled": false
210 + },
211 + "outputs": [
212 + {
213 + "data": {
214 + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYIAAAB0CAYAAACIRjU5AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvhp/UCwAAFYZJREFUeJztnXu0VVW9xz8/8Q0U4KN8kOhFLL1ZgnYj7Q6xLEWjNC0dXKO0vKmp4LWS6yMtLSNHmdeujzQHKiVqKg6v5gORLjdDQAR5BsGBeMj7KQLn8b1/zLk96xzOOXvtc/ZjHfbvM8Yaa8655przu+Zee//2mnPN+TNJOI7jONXLHpUW4DiO41QWNwSO4zhVjhsCx3GcKscNgeM4TpXjhsBxHKfKcUPgOI5T5bghcBzHqXLcEDiO41Q5bggcx3GqnD0rLSANPXr0UN++fSuq4d1336Vr164V1ZAVHVnQkBUdWdCQFR1Z0JAVHVnQADBt2rS1kg7Km1FS5rd+/fqp0kyYMKHSEiRlQ0cWNEjZ0JEFDVI2dGRBg5QNHVnQIEnAVKX4jfWuIcdxnCrHDYHjOE6V44bAcRynynFD4DiOU+V0CkOw76pVlZbgOI6z29IpDMFemzZVWoLjOM5uS6cwBI7jOE7pKLkhMLMuZjbdzJ6L8SPNbLKZLTCzsWa2d6k1OI7jOK2TyhCYWT8zG29ms2L8eDO7IWUdVwNzE/GfA7+SdDSwAbikEMGO4zhOcUn7RPBbYCRQCyBpJnBBvpPM7HDgLOCBGDfgNODJmGU08JXCJDuO4zjFJK0h2F/SG83S6lKcdyfwA6Ahxg8ANkrKnbsMOCylBsdxHKcEWFiOIk8msxeA7wFPSOpvZucBl0g6s41zzgYGS7rczE4FrgW+BbwuqW/M0xt4XtLHWzj/UuBSgAEw4I4JEwq+uGKydetWunXrVlENWdGRBQ1Z0ZEFDVnRkQUNWdGRBQ0AgwYNmibpxLwZ0yxIBBwFvAJsA5YDk4A+ec75GeEffw3wTjx3DLAW2DPmGQi8mK/+AVCSBZkKISuLSGVBRxY0SNnQkQUNUjZ0ZEGDlA0dWdAgFXnROUmLJH0eOAj4qKRTJNXkOWekpMMl9SGMJ7wqaSgwATgvZhsGjEujwXEcxykNbfojMLNrWkkHQNIv21HnD4HHzOxWYDrwYDvKcBzHcYpEPsc03eP+GOAk4NkY/xLw57SVSHoNeC2GFwGfKkSk4ziOUzraNASSbgEws5eA/pK2xPjNwBMlV+c4juOUnLSvj34E2JmI7wT6FF2N4ziOU3bS+ix+BHjDzJ4GBJwDPFwyVY7jOE7ZSGUIJN0W5xJ8NiZ9S9L00slyHMdxykUqQ2BmHyG8//90Mk3S0lIJcxzHccpD2jGC/wGei9t4YBHwQqlEtcioUZBiFrTjOI5TGGknlH1c0vFxO5rw+uek0kprxg9/CHPn5s/nOI7jFES7/BFIepMwr6C8NDTkz+M4juMURNoxguQM4z2A/sCakihyHMdxykra10e7J8J1hDGDPxZfTh7i0haO4zhO8UhrCOZIajKT2MzOx2cXO47jdHrSjhGMTJnmOI7jdDLyrT56JjAYOMzM7koc+gDpPJQVF+8achzHKTr5uoZWAFOBIcC0RPoWYESpRDmO4zjlI9/qozOAGWY2Ro1+hiuHPxE4juMUnXxdQ49L+how3cx2mdYr6fiSKXMcx3HKQr6uoavj/uxSC3Ecx3EqQ76uoZVxv6TQgs2sN2Gp6g8DDcD9kn5tZr2AsQR/BjXA1yRtSFlooTIcx3GcPLT5+qiZbTGzzYltS3Kfp+w64D8kfQz4NHCFmR0LXAeMj2sWjY/xdLghcBzHKTptGgJJ3SV9ILF1T+7znLsyrklEdHE5FzgM+DIwOmYbDXwltVqzsALpggWpT3Ecx3HaxpRyaWcz6w+cQvBQNqkQxzRm1ofg7P6fgaWSeiSObZDUs4VzLgUuBRgAA6YCkx9+mANef52+99zD1PvuY2u/fmkldJitW7fSrVu3stWXZR1Z0JAVHVnQkBUdWdCQFR1Z0AAwaNCgaZJOzJtRUt4NuAl4G7glbjOAG1Ke240wB+HcGN/Y7PiGfGUMCM8B0vz50rnnhvCTT6qcTJgwoaz1tUYWdGRBg5QNHVnQIGVDRxY0SNnQkQUNkgRMVYrf6bRrDV0InCBpO4CZ3Q68Cdza1klmthdhcboxkp6KyavM7BBJK83sEGB1Sg2NXUOO4zhO0Ui71lANsG8ivg/w97ZOMDMDHgTmSvpl4tCzwLAYHgaMS6khkDMEPnDsOI5TFNI+EewAZpvZy4QxgtOBSbn1hyRd1cI5JwMXAW+b2Vsx7T+B24HHzewSYClwfruUuyFwHMcpCmkNwdMkHNcDr+U7QdIkoLVf68+lrLcp3jXkOI5TdFIZAkmj8+cqE9415DiOU1RSjRGY2dlmNt3M1hcwoaz4JH/83RA4juMUhbRdQ3cC5wJvx1eSKod3DTmO4xSVtG8N/QOYVXEjADBvXtj7E4HjOE5RSPtE8APgeTObSHiDCIBmr4WWnr59G8NmsGEDDBkCjz4KRxxRVimO4zi7C2mfCG4DthHmEnRPbJXlwQdh0iS4/XaoqYE5cyqtyHEcp9OR9omgl6QvlFRJoZjB978fwhs2wJFHhvD998N3vlM5XY7jOJ2MtE8Er5hZtgxBkmkJd8qXXlo5HY7jOJ2QtIbgCuBPZvZeRV8fTZJcirqumTtlM1hSsC8dx3GcqiTthLLu0bPY0TRdc6hyXHNNY7imZtfj994LP/tZ2eQ4juN0VtJOKPs2MBH4E3Bz3N9UOllF4PbbYXNlH1ocx3E6A2m7hq4GTgKWSBoEnACsLZmqYvGF7A5rOI7jZIW0hmB7whfBPpLmAceUTlaRmDy50gocx3EyT1pDsMzMegDPAC+b2ThgRelkFZFBg3xZCsdxnDZIZQgknSNpo6SbgRsJDmfSO52vJK+9BuMK833jOAVRWwtXXglr1lRaieO0i7QTyt5H0sRSCCkp55wD9fWwR9oHIMcpgGeegbvvhvXrYcyYSqtxnIKpnl/GLl3CDOS+fcM8gwMPDPMPms9B2F2or4fLLoNFiyqtpPLU18PKlaWvZ8eOpnEJ7rwT1rbwXsVf/gJbtpRek+OkoCKGwMzOMLP5ZrbQzK4rW8W9esHfo6vldetgr73CdvnlwTjktpNPDvuHHiqbtKIzZUqYS3HhhU3TJbjtNli4sDK6isFjj8FZZ6XPP3w4HHoobNzYNH3FCrj66vR/BlavhoEDYfnypulduoR9rpytW8N+2jQYMQKGRRfdUtg2bw732PnRS+uUKf6qc1qWLoUePRpXIXaKg6SybkAXguP7o4C9gRnAsW2dM6DxK+Rb1reDDmo5/YMfbAwPHSoNGSINHCidcUZj+k03SaNGSV27hv3gwSHP5MnSyy9LDz0kLV/+fv6/PP649MAD0nnnSStWSFOmSLfcIi1eLC1YIN11l7RpU2P5S5ZIb70VNG7a1Fj3uHEhfuut0vbt0sqV0ogR0jvvhLq7dJFmzpR+8pOQ/6qrpC1bpGuv1cTnn5ceeSSkn3669PrrIfyjHwXNIPXvL61eHcI33hjKz2nasSPsP/MZqaEhaBo7NoQffVSaPVuqqwt5TjklpK9YIb37riRJixZJq1ZpwquvShs2BP319dLFF0u/+lXIU1srvfdeCL/yivTiiyHP0qWhnRoawjXccUcIb9oU6qivD/WPGxfSa2vDdTc0SLNmSffcE8Lbt0srVgQNN94YtNbXh7wvvRTyzJghXXRRuN6GhvBZ5MqcNy+EJWnt2hDevFm64YZQdkND0N/QEO4LkIYPD/F168K+rk766U+lDRs08YUXwn1SXx+21asby1+9OtRZWyvNmSNt2xbCixZJW7eGfDU1Ib2urrGtd+6U3nwzfHa1teFYfX0I547X1QWddXWa+OKLQXsu744dIU9tbQjX1obj27aF/fbt0saNofx160L6e++Fc9avD5/V5s1hW7Omsc4FC0J848aQtn59uI7Fi6XFiwVMTfO7bOV2MWBmA4GbJX0xxkdGg9TqNOATzTS1TPocx3F2FwymSToxX76CB4uLwGEERzc5lgH/0jyTmV0K5FaQ22Ewqwza2uJAsjGJLgs6sqABsqEjCxogGzqyoAGyoSMLGgCOSJOpEoagJddiuzyWSLofuB/AzKamsWqlJAsasqIjCxqyoiMLGrKiIwsasqIjCxoKoRKDxcuA3on44XSWyWmO4zi7IZUwBFOAo83sSDPbG7gAeLYCOhzHcRwq0DUkqc7Mvge8SHiD6HeSZuc57f7SK8tLFjRANnRkQQNkQ0cWNEA2dGRBA2RDRxY0pKbsbw05juM42aJ6ZhY7juM4LeKGwHEcp8rJtCEo5VIUZtbbzCaY2Vwzm21mV8f0Xmb2spktiPueMd3M7K6oZaaZ9U+UNSzmX2Bmw9qpp4uZTTez52L8SDObHMscGwfWMbN9YnxhPN4nUcbImD7fzL5YYP09zOxJM5sX22RgJdrCzEbEz2OWmf3BzPYtR1uY2e/MbLWZzUqkFe36zWyAmb0dz7nLzHZ5jboVDb+In8lMM3vawnLwbV5ja9+b1toxjY7EsWvNTGZ2YLnbIqZfGa9ttpmNqkRbmNknzeyvZvaWmU01s0+Vsi3KQrmXmCjlUhQFln8I0D+GuwN/A44FRgHXxfTrgJ/H8GDgBcI8iE8Dk2N6L2BR3PeM4Z7t0HMN8HvguRh/HLgghu8FLovhy4F7Y/gCYGwMHxvbaB/gyNh2XQqofzTw7RjeG+hR7rYgTDZcDOyXaINvlqMtgH8F+gOzEmlFu37gDWBgPOcF4MyUGr4A7BnDP09oaPEaaeN701o7ptER03sTXvJYAhxYgbYYBLwC7BPjB1eiLYCXcprj9b9WyrYox1b2Cgv4URgIvJiIjwRGlrC+ccDpwHzgkJh2CDA/hu8DLkzknx+PXwjcl0hvki9l3YcD44HTgOfiTbGWxh+A99sifhEHxvCeMZ81b59kvhT1f4DwA2zN0svaFjTOOu8Vr+054IvlagugT7MvfFGuPx6bl0hvkq8tDc2OnQOMaen7kLtGWvnetHVPpdUBPAl8Aqih0RCUrS0IP96fbyFfWdsilv/1hP7fl7otSr1luWuopaUoDitFRbFL4QRgMvAhSSsB4v7gPHqKofNO4AdAQ4wfAGyUlFsWM1nm+/XF45ti/o7oOApYAzxkoXvqATPrSpnbQtJy4A5gKbAyXts0ytsWSYp1/YfFcEf1XEz419geDW3dU3kxsyHAckkzmh0qZ1v0Az4bu3QmmtlJ7dTQobYAhgO/MLN/EO7Xke3UUaz7osNk2RCkWoqiw5WYdQP+CAyX1NZawK3p6ZBOMzsbWC1pWoq6SqVjT8Lj7z2STgDeJXSFtEap2qIn8GXC4/2hQFfgzDbKLImOFBRab4f1mNn1QB2Q83xTNg1mtj9wPXBTS4fLpYNwn/YkdLt8H3g89qmX+/O4DBghqTcwguCxkQroKBpZNgQlX4rCzPYiGIExkp6KyavM7JB4/BBgdR49HdV5MjDEzGqAxwjdQ3cCPcwsN+EvWeb79cXjHwTWd1DHMmCZpMkx/iTBMJS7LT4PLJa0RlIt8BTwGcrbFkmKdf3LYrhdeuLg4tnAUMU+hHZoWEvr7ZiPfyIY5xnxPj0ceNPMPtwOHR1pi2XAUwq8QXiCPrAdGjrSFgDDCPcmwBPApxL6ynZfFJVK9Eel2QjWfxHhBswN9BxXxPINeBi4s1n6L2g6QDgqhs+i6UDQGzG9F6F/vWfcFgO92qnpVBoHi5+g6WDW5TF8BU0HSB+P4eNoOmC2iMIGi/8XOCaGb47tUNa2IKxCOxvYP5Y9GriyXG3Brn3BRbt+wtIqn6ZxUHBwSg1nAHOAg5rla/EaaeN701o7ptHR7FgNjWME5WyL7wI/juF+hO4WK3dbAHOBU2P4c4SlnkvaFqXeyl5hQeLCKPzfCCP/1xe57FMIj2EzgbfiNpjQfzgeWBD3uQ/MgN9ELW8DJybKuhhYGLdvdUDTqTQagqMIbxQsjDdt7k2JfWN8YTx+VOL866O++RT49gHwSWBqbI9n4g1b9rYAbgHmEZYdfyR+uUveFsAfCOMStYR/apcU8/qBE+M1/R24m2YD821oWEj4wcvdo/fmu0Za+d601o5pdDQ7XkOjIShnW+wNPBrPfRM4rRJtQfjtmEYwLJOBAaVsi3JsvsSE4zhOlZPlMQLHcRynDLghcBzHqXLcEDiO41Q5bggcx3GqHDcEjuM4VY4bAsdxnCrHDYHjOE6V44bA6ZSY2VUW/CaMyZ87u5jZfnEBtS4x/u9m9t/N8sw2s4+2cv7eZvbnxHIJjlMwbgiczsrlhOn4Q3MJ0TFIZ7unLyasn1Mf48cD03MHzWxf4COE2c27IGknYdbz10us09mN6WxfGsfBzO4lLBHwrAWPZnPjv+g3gd5m9m9m9kb0IHVf4t/29dFb1SsWvJ9dG9P7NPNAda2Z3RzDu5QV8881s9/Gf+svmdl+Mf83oneqGWb2SEz7iUUPeDF+m5ldFaNDCb4wcnw8Xkcy/jdJ9Wb2atTxlpltN7PzY55nYjmO0y7cEDidDknfJazSOAh4GjgGeFhhCe39Cf+OT5b0SaAeGGpmAwgL050AnAuc1FLZSczsYy2VFQ8fDfxG0nHARuCrZnYcYc2b0yR9Asj9+D9IWLGS+MRyATAmukc8SlJNotrjgKfMrCau9PkCYd0aJJ0WddwHPEvjCpiz0lyP47SG9ys6uwNLJP01hj8HDACmRPev+xGWj+4FPC1pG4CZPZui3NbK+jNhuey3Yr5phBUqewJPSloLIGl93NeY2TozOwH4EDBd0jozO5RgRIiaegNrJH00kXY3YQXNXPwbBB8NX811J8WnhZ1m1l3SljQN5jhJ3BA4uwPvJsIGjJY0MpnBzIbTutOPOpo+He+bp6w+wI5EUj3BSFgbdTxA8L/8YeB3Me29RF0QxgdmNzvvWGLXUewKGgp8WcFfQ5J9gO2t1O04beJdQ87uxnjgPDM7GMDMepnZEYR/8efEt3S6A19KnLMKONjMDjCzfQhOYNoqq626v2ZmB+TyJ449TfAtcBLB5y2SNgBd4oAwhPGAOc3KPA6YGT3ZXQ6cK6nJD36sb00LxsFxUuFPBM5uhaQ5ZnYD8FLsj68FrpD0VzMbS1jTfwnBEU/unFoz+zFhbfnFBH8IrZYFvNNK3bPN7DZgopnVE97++WY8ttPMJhB85dYnTnuJsL79KwRD8FzuQDQkJmmVmY0meF/7v9hN9V+Sci4SBwHPt6/FHAf3R+BUJ/GtoK2S7ihTfXsQ3gY6X9KCRPoJwDWSLupA2U8BIyXN77hSpxrxriHHKTFmdizBM9X4pBEAkDQdmJB7xbUdZe8NPONGwOkI/kTgOI5T5fgTgeM4TpXjhsBxHKfKcUPgOI5T5bghcBzHqXLcEDiO41Q5bggcx3GqHDcEjuM4Vc7/A7VfAfooeGtaAAAAAElFTkSuQmCC\n",
215 + "text/plain": [
216 + "<Figure size 432x288 with 1 Axes>"
217 + ]
218 + },
219 + "metadata": {},
220 + "output_type": "display_data"
221 + }
222 + ],
223 + "source": [
224 + "# amplitude....\n",
225 + "plt.subplot(3,1,2)\n",
226 + "\n",
227 + "# Plot single-sided amplitude spectrum.\n",
228 + "\n",
229 + "plt.plot(f0,amplitude_Hz,'r') # 2* ???\n",
230 + "plt.xticks(np.arange(0,20000,2000))\n",
231 + "plt.xlim( 0, 20000)\n",
232 + "plt.ylim( 0, 50)\n",
233 + "#plt.title('Single-Sided Amplitude Spectrum of y(t)')\n",
234 + "plt.xlabel('frequency($Hz$)')\n",
235 + "plt.ylabel('amplitude')\n",
236 + "plt.grid()\n",
237 + "plt.savefig(\"sounds/test_figure%d-fft.png\"%count,dpi=300)\n",
238 + "\n",
239 + "\n",
240 + "print(\"%d번 음성 FFT완료\"%count)\n",
241 + "count = count + 1\n"
242 + ]
243 + },
244 + {
245 + "cell_type": "code",
246 + "execution_count": 102,
247 + "metadata": {},
248 + "outputs": [
249 + {
250 + "data": {
251 + "text/plain": [
252 + "4"
253 + ]
254 + },
255 + "execution_count": 102,
256 + "metadata": {},
257 + "output_type": "execute_result"
258 + }
259 + ],
260 + "source": [
261 + "'''\n",
262 + "Fs = 2000 # 샘플링 주파수\n",
263 + "T = 1/Fs # 샘플링 interval time <-? \n",
264 + "te= 5 #end of time\n",
265 + "t = np.arange(0,te,T) # Time vector (0초부터 te초까지 T간격으로 떨어져있는 배열생성)\n",
266 + "noise = np.random.normal(0,0.05,len(t)) \n",
267 + "x=0.6*np.cos(2*np.pi*60*t + np.pi/2) + np.cos(2*np.pi*120*t)\n",
268 + "y= x+noise\n",
269 + "\n",
270 + "'''\n",
271 + "'''\n",
272 + "# figure 1 ..................................\n",
273 + "plt.figure(num=2,dpi=100,facecolor='white')\n",
274 + "plt.subplots_adjust(hspace = 0.6, wspace = 0.3)\n",
275 + "plt.subplot(3,1,1)\n",
276 + "\n",
277 + "plt.plot(t,y,'r')\n",
278 + "plt.title('Signal FFT analysis')\n",
279 + "plt.xlabel('time($sec$)')\n",
280 + "plt.ylabel('y')\n",
281 + "\n",
282 + "#plt.xlim( 0, 0.1)\n",
283 + "\n",
284 + "\n",
285 + "# Phase .... <- 이해안감\n",
286 + "#plt.figure(num=2,dpi=100,facecolor='white')\n",
287 + "plt.subplot(3,1,3)\n",
288 + "plt.plot(f0,phase_ang,'r') # 2* ???\n",
289 + "plt.xlim( 0, 200)\n",
290 + "plt.ylim( -180, 180)\n",
291 + "#plt.title('Single-Sided Phase Spectrum of y(t)')\n",
292 + "plt.xlabel('frequency($Hz$)')\n",
293 + "plt.ylabel('phase($deg.$)')\n",
294 + "plt.xticks([0, 60, 120, 200])\n",
295 + "plt.yticks([-180, -90, 0, 90, 180])\n",
296 + "plt.grid()\n",
297 + "\n",
298 + "plt.savefig(\"./test_figure2.png\",dpi=300)\n",
299 + "plt.show()\n",
300 + "\n",
301 + "'''"
302 + ]
303 + },
304 + {
305 + "cell_type": "code",
306 + "execution_count": null,
307 + "metadata": {},
308 + "outputs": [],
309 + "source": []
310 + }
311 + ],
312 + "metadata": {
313 + "kernelspec": {
314 + "display_name": "Python 3",
315 + "language": "python",
316 + "name": "python3"
317 + },
318 + "language_info": {
319 + "codemirror_mode": {
320 + "name": "ipython",
321 + "version": 3
322 + },
323 + "file_extension": ".py",
324 + "mimetype": "text/x-python",
325 + "name": "python",
326 + "nbconvert_exporter": "python",
327 + "pygments_lexer": "ipython3",
328 + "version": "3.6.5"
329 + }
330 + },
331 + "nbformat": 4,
332 + "nbformat_minor": 2
333 +}
1 +{
2 + "cells": [
3 + {
4 + "cell_type": "code",
5 + "execution_count": 1,
6 + "metadata": {},
7 + "outputs": [],
8 + "source": [
9 + " import numpy as np\n",
10 + " import pylab\n",
11 + " import matplotlib.pyplot as plt\n",
12 + " from scipy.io import wavfile\n",
13 + " import time\n",
14 + " import sys\n",
15 + " import seaborn as sns\n",
16 + " import pyaudio"
17 + ]
18 + },
19 + {
20 + "cell_type": "code",
21 + "execution_count": null,
22 + "metadata": {},
23 + "outputs": [],
24 + "source": [
25 + "\n",
26 + "i=0\n",
27 + "f,ax = plt.subplots(2)\n",
28 + "\n",
29 + "# Prepare the Plotting Environment with random starting values\n",
30 + "x = np.arange(10000)\n",
31 + "y = np.random.randn(10000)\n",
32 + "\n",
33 + "# Plot 0 is for raw audio data\n",
34 + "li, = ax[0].plot(x, y)\n",
35 + "ax[0].set_xlim(0,1000)\n",
36 + "ax[0].set_ylim(-5000,5000)\n",
37 + "ax[0].set_title(\"Raw Audio Signal\")\n",
38 + "# Plot 1 is for the FFT of the audio\n",
39 + "li2, = ax[1].plot(x, y)\n",
40 + "ax[1].set_xlim(0,5000)\n",
41 + "ax[1].set_ylim(-100,100)\n",
42 + "ax[1].set_title(\"Fast Fourier Transform\")\n",
43 + "# Show the plot, but without blocking updates\n",
44 + "plt.pause(0.01)\n",
45 + "plt.tight_layout()\n"
46 + ]
47 + },
48 + {
49 + "cell_type": "code",
50 + "execution_count": null,
51 + "metadata": {},
52 + "outputs": [],
53 + "source": [
54 + "\n",
55 + "FORMAT = pyaudio.paInt16 # We use 16bit format per sample\n",
56 + "CHANNELS = 1\n",
57 + "RATE = 44100\n",
58 + "CHUNK = 1024 # 1024bytes of data red from a buffer\n",
59 + "RECORD_SECONDS = 0.1\n",
60 + "WAVE_OUTPUT_FILENAME = \"file.wav\"\n",
61 + "\n",
62 + "audio = pyaudio.PyAudio()\n",
63 + "\n",
64 + "# start Recording\n",
65 + "stream = audio.open(format=FORMAT,\n",
66 + " channels=CHANNELS,\n",
67 + " rate=RATE,\n",
68 + " input=True)#,\n",
69 + " #frames_per_buffer=CHUNK)\n",
70 + "\n",
71 + "global keep_going\n",
72 + "keep_going = True\n",
73 + "\n",
74 + "def plot_data(in_data):\n",
75 + " # get and convert the data to float\n",
76 + " audio_data = np.fromstring(in_data, np.int16)\n",
77 + " # Fast Fourier Transform, 10*log10(abs) is to scale it to dB\n",
78 + " # and make sure it's not imaginary\n",
79 + " dfft = 10.*np.log10(abs(np.fft.rfft(audio_data)))\n",
80 + "\n",
81 + " # Force the new data into the plot, but without redrawing axes.\n",
82 + " # If uses plt.draw(), axes are re-drawn every time\n",
83 + " #print audio_data[0:10]\n",
84 + " #print dfft[0:10]\n",
85 + " #print\n",
86 + " li.set_xdata(np.arange(len(audio_data)))\n",
87 + " li.set_ydata(audio_data)\n",
88 + " li2.set_xdata(np.arange(len(dfft))*10.)\n",
89 + " li2.set_ydata(dfft)\n",
90 + "\n",
91 + " # Show the updated plot, but without blocking\n",
92 + " plt.pause(0.01)\n",
93 + " if keep_going:\n",
94 + " return True\n",
95 + " else:\n",
96 + " return False\n"
97 + ]
98 + },
99 + {
100 + "cell_type": "code",
101 + "execution_count": null,
102 + "metadata": {},
103 + "outputs": [],
104 + "source": [
105 + "\n",
106 + "# Open the connection and start streaming the data\n",
107 + "stream.start_stream()\n",
108 + "print (\"\\n+---------------------------------+\")\n",
109 + "print (\"| Press Ctrl+C to Break Recording |\")\n",
110 + "print (\"+---------------------------------+\\n\")\n",
111 + "\n",
112 + "# Loop so program doesn't end while the stream callback's\n",
113 + "# itself for new data\n",
114 + "while keep_going:\n",
115 + " try:\n",
116 + " plot_data(stream.read(CHUNK))\n",
117 + " except KeyboardInterrupt:\n",
118 + " keep_going=False\n",
119 + " except:\n",
120 + " pass\n",
121 + "\n",
122 + "# Close up shop (currently not used because KeyboardInterrupt\n",
123 + "# is the only way to close)\n",
124 + "stream.stop_stream()\n",
125 + "stream.close()\n",
126 + "\n",
127 + "audio.terminate()\n"
128 + ]
129 + },
130 + {
131 + "cell_type": "code",
132 + "execution_count": null,
133 + "metadata": {},
134 + "outputs": [],
135 + "source": []
136 + }
137 + ],
138 + "metadata": {
139 + "kernelspec": {
140 + "display_name": "Python 3",
141 + "language": "python",
142 + "name": "python3"
143 + },
144 + "language_info": {
145 + "codemirror_mode": {
146 + "name": "ipython",
147 + "version": 3
148 + },
149 + "file_extension": ".py",
150 + "mimetype": "text/x-python",
151 + "name": "python",
152 + "nbconvert_exporter": "python",
153 + "pygments_lexer": "ipython3",
154 + "version": "3.6.5"
155 + }
156 + },
157 + "nbformat": 4,
158 + "nbformat_minor": 2
159 +}
This diff could not be displayed because it is too large.
1 +{
2 + "cells": [
3 + {
4 + "cell_type": "code",
5 + "execution_count": 2,
6 + "metadata": {},
7 + "outputs": [
8 + {
9 + "data": {
10 + "text/plain": [
11 + "'\\n평가방법 : positive를 높이는방식\\n\\n본논문\\n- STFT magnitude Spectrun\\n- n=40 log mel filter bank\\n\\n다른논문\\n-STFT maginitude spectogram\\n- n=80 mel scaled filter bank\\n- scale log magnitude\\n- batch nomalization (0,1)\\n- subtract mean overtime on spectogram (for remove frequency dependency noise = colored noise)\\n'"
12 + ]
13 + },
14 + "execution_count": 2,
15 + "metadata": {},
16 + "output_type": "execute_result"
17 + }
18 + ],
19 + "source": [
20 + "'''\n",
21 + "평가방법 : positive를 높이는방식\n",
22 + "\n",
23 + "본논문\n",
24 + "- STFT magnitude Spectrun\n",
25 + "- n=40 log mel filter bank\n",
26 + "\n",
27 + "다른논문\n",
28 + "-STFT maginitude spectogram\n",
29 + "- n=80 mel scaled filter bank\n",
30 + "- scale log magnitude\n",
31 + "- batch nomalization (0,1)\n",
32 + "- subtract mean overtime on spectogram (for remove frequency dependency noise = colored noise)\n",
33 + "'''"
34 + ]
35 + },
36 + {
37 + "cell_type": "code",
38 + "execution_count": 3,
39 + "metadata": {},
40 + "outputs": [
41 + {
42 + "name": "stderr",
43 + "output_type": "stream",
44 + "text": [
45 + "Using TensorFlow backend.\n"
46 + ]
47 + }
48 + ],
49 + "source": [
50 + "#path 관련 라이브러리\n",
51 + "import glob\n",
52 + "import csv\n",
53 + "\n",
54 + "#csv저장 라이브러리\n",
55 + "import pandas as pd\n",
56 + "\n",
57 + "# Scientific Math 라이브러리 \n",
58 + "import numpy as np\n",
59 + "import librosa\n",
60 + "import librosa.display\n",
61 + "import os\n",
62 + "\n",
63 + "# Visualization 라이브러리\n",
64 + "import matplotlib.pyplot as plt\n",
65 + "import IPython.display as ipd\n",
66 + "\n",
67 + "#keras\n",
68 + "from keras.utils import np_utils\n",
69 + "from keras.models import Sequential\n",
70 + "from keras.layers import Dense, Conv2D, MaxPooling2D, GRU,Dropout, Flatten,Reshape,BatchNormalization\n",
71 + "from keras.callbacks import ModelCheckpoint, EarlyStopping\n",
72 + "\n"
73 + ]
74 + },
75 + {
76 + "cell_type": "code",
77 + "execution_count": 4,
78 + "metadata": {},
79 + "outputs": [],
80 + "source": [
81 + "audio_path = './SOUNDS/warbler/'\n",
82 + "n_mels = 40\n",
83 + "n_frame = 500\n",
84 + "window_size=1024\n",
85 + "hop_size=512\n",
86 + "sample_rate=25600\n",
87 + "num_file = 0 #데이터갯수 이후에 덮어씌워짐"
88 + ]
89 + },
90 + {
91 + "cell_type": "code",
92 + "execution_count": 7,
93 + "metadata": {},
94 + "outputs": [
95 + {
96 + "name": "stdout",
97 + "output_type": "stream",
98 + "text": [
99 + "Preparing file lists.\n",
100 + "Done.\n",
101 + "45\n"
102 + ]
103 + }
104 + ],
105 + "source": [
106 + "#prepare labels\n",
107 + "labels = []\n",
108 + "with open(audio_path+'labels.csv', mode='r',encoding='utf-8') as f:\n",
109 + " reader = csv.reader(f)\n",
110 + " for row in reader : \n",
111 + " labels.append(row)\n",
112 + "labels.sort(key=lambda x:x[0])\n",
113 + "labels = np.array(labels) \n",
114 + "labels = labels[0:-1,1]\n",
115 + "\n",
116 + "# prepare file lists\n",
117 + "print(\"Preparing file lists.\")\n",
118 + "dirs = []\n",
119 + "for filename in glob.glob(audio_path+'wav/'+'*.wav'):\n",
120 + " dirs.append(filename)\n",
121 + "dirs.sort()\n",
122 + "print(\"Done.\")\n",
123 + "\n",
124 + "num_file = len(dirs)"
125 + ]
126 + },
127 + {
128 + "cell_type": "code",
129 + "execution_count": 7,
130 + "metadata": {},
131 + "outputs": [
132 + {
133 + "data": {
134 + "image/png": "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\n",
135 + "text/plain": [
136 + "<Figure size 720x288 with 2 Axes>"
137 + ]
138 + },
139 + "metadata": {},
140 + "output_type": "display_data"
141 + }
142 + ],
143 + "source": [
144 + "# subtract mean for simply romove white noise from spectogram_ Checking\n",
145 + "S=librosa.feature.melspectrogram(y=y, sr=sr,n_fft=window_size, hop_length=hop_size, power=2.0, n_mels=40)\n",
146 + "Y=S-S.mean(axis=1,keepdims=True)\n",
147 + "\n",
148 + "plt.figure(figsize=(10,4))\n",
149 + "librosa.display.specshow(librosa.power_to_db(Y,ref=np.max),y_axis='mel',x_axis='time')\n",
150 + "plt.colorbar(format='%+2.0f dB')\n",
151 + "plt.title('Mel Spectogram')\n",
152 + "plt.tight_layout()"
153 + ]
154 + },
155 + {
156 + "cell_type": "code",
157 + "execution_count": 8,
158 + "metadata": {},
159 + "outputs": [
160 + {
161 + "name": "stdout",
162 + "output_type": "stream",
163 + "text": [
164 + "making mel_spectogram.\n",
165 + "1000\n",
166 + "2000\n",
167 + "3000\n",
168 + "4000\n",
169 + "5000\n",
170 + "6000\n",
171 + "7000\n",
172 + "8000\n"
173 + ]
174 + }
175 + ],
176 + "source": [
177 + "print('making substract_mean_ver_mel_spectogram.')\n",
178 + "mel_spectogram = []\n",
179 + "count = 0\n",
180 + "for direct in dirs:\n",
181 + " y,sr=librosa.core.load(direct,sr=sample_rate)\n",
182 + " S=librosa.feature.melspectrogram(y=y, sr=sr,n_fft=window_size, hop_length=hop_size, power=2.0, n_mels=40)\n",
183 + " if np.shape(S)[1]<500 : \n",
184 + " S = np.concatenate((S,S),axis=1)\n",
185 + " S=S[:,0:500] \n",
186 + " Y=S-S.mean(axis=1,keepdims=True)\n",
187 + " mel_spectogram.append(Y)\n",
188 + " count= count+1\n",
189 + " if(count%1000==0) :\n",
190 + " print(count)\n",
191 + "print('done')\n",
192 + "\n",
193 + "#np배열로 바꿔줌\n",
194 + "mel_spectogram=np.array(mel_spectogram)"
195 + ]
196 + },
197 + {
198 + "cell_type": "code",
199 + "execution_count": 19,
200 + "metadata": {},
201 + "outputs": [
202 + {
203 + "name": "stdout",
204 + "output_type": "stream",
205 + "text": [
206 + "581\n",
207 + "2451\n",
208 + "4721\n",
209 + "5115\n"
210 + ]
211 + },
212 + {
213 + "data": {
214 + "text/plain": [
215 + "(40, 98)"
216 + ]
217 + },
218 + "execution_count": 19,
219 + "metadata": {},
220 + "output_type": "execute_result"
221 + }
222 + ],
223 + "source": [
224 + "# 10초 이하인거는 반복해서 10초로 길이 늘려주기\n",
225 + "for i in range(0,num_file) : \n",
226 + " if np.shape(mel_spectogram[i])[1] != 500:\n",
227 + " mel_spectogram[i] = np.concatenate((mel_spectogram[i],mel_spectogram[i]),axis=1)\n",
228 + " mel_spectogram[i] = np.concatenate((mel_spectogram[i],mel_spectogram[i]),axis=1)\n",
229 + " mel_spectogram[i] = (mel_spectogram[i]) [:,0:500]\n",
230 + " np.shape(mel_spectogram[i])\n",
231 + " "
232 + ]
233 + },
234 + {
235 + "cell_type": "code",
236 + "execution_count": 30,
237 + "metadata": {},
238 + "outputs": [],
239 + "source": [
240 + "#csv파일로 저장하려고 2차원배월로 만듬\n",
241 + "mel_spectogram=np.reshape(mel_spectogram,(np.shape(mel_spectogram)[0],-1))\n",
242 + "df = pd.DataFrame(mel_spectogram[0:num_file,:])\n",
243 + "df.to_csv(audio_path+\"/mel_spec.csv\")\n",
244 + "\n",
245 + "if(np.shape(labels)[0]!=num_file) :\n",
246 + " print('something wrong')"
247 + ]
248 + }
249 + ],
250 + "metadata": {
251 + "kernelspec": {
252 + "display_name": "Python 3",
253 + "language": "python",
254 + "name": "python3"
255 + },
256 + "language_info": {
257 + "codemirror_mode": {
258 + "name": "ipython",
259 + "version": 3
260 + },
261 + "file_extension": ".py",
262 + "mimetype": "text/x-python",
263 + "name": "python",
264 + "nbconvert_exporter": "python",
265 + "pygments_lexer": "ipython3",
266 + "version": "3.6.5"
267 + }
268 + },
269 + "nbformat": 4,
270 + "nbformat_minor": 2
271 +}
1 +{
2 + "cells": [
3 + {
4 + "cell_type": "markdown",
5 + "metadata": {},
6 + "source": [
7 + "TEST할것\n",
8 + "<입력값>\n",
9 + "1. 일정 데시벨파워 이하는 다 지운 멜스펙토그램 <-아... 원래 데이터셋 새소리 어느정도 작은 소리까지 잡는겨\n",
10 + "2. mel filter 80 & axis=1평균을 뺀 멜스펙토그램\n",
11 + "3. 새소리 주파수 이하는 주파수대는 짜름\n",
12 + "5. 커널씩 보면서 차이나는것만 뽑아내기 (그주변만 비교하는게 있을거같은데)\n",
13 + "6. 멜필터 안씌운거 보고 새소리 주파수 이하 짤라버릴때등.. 안씌운거 보기\n",
14 + "\n",
15 + "<모델>\n",
16 + "1. 일반 뛰어난 CNN모델. 첫번째 모델이 왜 더 좋은지 보자\n",
17 + "3. C+RNN <- RNN 부분 잘 된건가?\n",
18 + "4. Capsul network\n",
19 + "\n",
20 + "<추가적>\n",
21 + "1. 라벨링 : 확실히 귀에 잘 들리고 눈에 잘 보이는 애들만 1로 라벨링, 희미한건 0으로 라벨링 \n",
22 + " -> 필드테스트 한 애들만 맞춘거 비율이 높도록 보이기. 머신이 새라고 한거중에 0인애들만 또 보여주기\n",
23 + "2. 필드테스트랑 원래하던거랑 왜안될까? -> 짹짹이가 데이터셋에 별로없거나 모델이 안좋거나.. (먼저 컴한테 분류시켜보고 판단?)\n",
24 + "3. 그경우, 찌르레기 소리에 초점을 맞춰서 저 패턴을 학습시키고 아예 그걸 찾도록 하는것도 나쁘지 않을듯\n",
25 + "4. 아이폰녹음이랑 뭐가다른지, 실제로 차이가 난건지도 봐야함. "
26 + ]
27 + },
28 + {
29 + "cell_type": "markdown",
30 + "metadata": {},
31 + "source": [
32 + "1. CRNN - RNN 코드 다시 보고 돌리기\n",
33 + "2. CNN - 논문1네 모델 돌리기\n",
34 + "3. 캡슐 네트워크 돌리기\n",
35 + "\n",
36 + "#### scipy / librosa 둘다로 mel spectogram 짜봤는데 librosa가 더 좋았음."
37 + ]
38 + }
39 + ],
40 + "metadata": {
41 + "kernelspec": {
42 + "display_name": "Python 3",
43 + "language": "python",
44 + "name": "python3"
45 + },
46 + "language_info": {
47 + "codemirror_mode": {
48 + "name": "ipython",
49 + "version": 3
50 + },
51 + "file_extension": ".py",
52 + "mimetype": "text/x-python",
53 + "name": "python",
54 + "nbconvert_exporter": "python",
55 + "pygments_lexer": "ipython3",
56 + "version": "3.6.5"
57 + }
58 + },
59 + "nbformat": 4,
60 + "nbformat_minor": 2
61 +}
1 +{
2 + "cells": [
3 + {
4 + "cell_type": "code",
5 + "execution_count": 2,
6 + "metadata": {},
7 + "outputs": [
8 + {
9 + "data": {
10 + "text/plain": [
11 + "'\\n평가방법 : positive를 높이는방식\\n\\n본논문\\n- STFT magnitude Spectrun\\n- n=40 log mel filter bank\\n\\n다른논문\\n-STFT maginitude spectogram\\n- n=80 mel scaled filter bank\\n- scale log magnitude\\n- batch nomalization (0,1)\\n- subtract mean overtime on spectogram (for remove frequency dependency noise = colored noise)\\n'"
12 + ]
13 + },
14 + "execution_count": 2,
15 + "metadata": {},
16 + "output_type": "execute_result"
17 + }
18 + ],
19 + "source": [
20 + "'''\n",
21 + "평가방법 : positive를 높이는방식\n",
22 + "\n",
23 + "본논문\n",
24 + "- STFT magnitude Spectrun\n",
25 + "- n=40 log mel filter bank\n",
26 + "\n",
27 + "다른논문\n",
28 + "-STFT maginitude spectogram\n",
29 + "- n=80 mel scaled filter bank\n",
30 + "- scale log magnitude\n",
31 + "- batch nomalization (0,1)\n",
32 + "- subtract mean overtime on spectogram (for remove frequency dependency noise = colored noise)\n",
33 + "'''"
34 + ]
35 + },
36 + {
37 + "cell_type": "code",
38 + "execution_count": 1,
39 + "metadata": {},
40 + "outputs": [
41 + {
42 + "name": "stdout",
43 + "output_type": "stream",
44 + "text": [
45 + "[name: \"/device:CPU:0\"\n",
46 + "device_type: \"CPU\"\n",
47 + "memory_limit: 268435456\n",
48 + "locality {\n",
49 + "}\n",
50 + "incarnation: 1817485338440268463\n",
51 + "]\n"
52 + ]
53 + }
54 + ],
55 + "source": [
56 + "from tensorflow.python.client import device_lib\n",
57 + "print(device_lib.list_local_devices())\n",
58 + "\n",
59 + "from keras.utils.training_utils import multi_gpu_model\n"
60 + ]
61 + },
62 + {
63 + "cell_type": "code",
64 + "execution_count": null,
65 + "metadata": {},
66 + "outputs": [],
67 + "source": [
68 + "gpunum = 0"
69 + ]
70 + },
71 + {
72 + "cell_type": "code",
73 + "execution_count": 2,
74 + "metadata": {},
75 + "outputs": [],
76 + "source": [
77 + "#path 관련 라이브러리\n",
78 + "import glob\n",
79 + "import csv\n",
80 + "\n",
81 + "#csv저장 라이브러리\n",
82 + "import pandas as pd\n",
83 + "\n",
84 + "# Scientific Math 라이브러리 \n",
85 + "import numpy as np\n",
86 + "import librosa\n",
87 + "import librosa.display\n",
88 + "import os\n",
89 + "\n",
90 + "# Visualization 라이브러리\n",
91 + "import matplotlib.pyplot as plt\n",
92 + "import IPython.display as ipd\n",
93 + "\n",
94 + "#keras\n",
95 + "from keras.utils import np_utils\n",
96 + "from keras.models import Sequential\n",
97 + "from keras.layers import Dense, Conv2D, MaxPooling2D, GRU,Dropout, Flatten,Reshape,BatchNormalization\n",
98 + "from keras.callbacks import ModelCheckpoint, EarlyStopping\n",
99 + "from sklearn.linear_model import LogisticRegression\n",
100 + "from sklearn.metrics import roc_curve, auc, roc_auc_score"
101 + ]
102 + },
103 + {
104 + "cell_type": "code",
105 + "execution_count": 3,
106 + "metadata": {},
107 + "outputs": [],
108 + "source": [
109 + "audio_path = './SOUNDS/ff1010bird/'\n",
110 + "audio_path2= './SOUNDS/warbler/'\n",
111 + "n_mels = 40\n",
112 + "n_frame = 500\n",
113 + "window_size=1024\n",
114 + "hop_size=512\n",
115 + "sample_rate=25600\n"
116 + ]
117 + },
118 + {
119 + "cell_type": "code",
120 + "execution_count": 4,
121 + "metadata": {},
122 + "outputs": [
123 + {
124 + "name": "stdout",
125 + "output_type": "stream",
126 + "text": [
127 + "Preparing ff1010_labels.\n",
128 + "Done.\n",
129 + "Preparing walber_labels.\n",
130 + "Done.\n"
131 + ]
132 + }
133 + ],
134 + "source": [
135 + "#prepare labels\n",
136 + "print(\"Preparing ff1010_labels.\")\n",
137 + "labels_1=[]\n",
138 + "with open(audio_path+'labels.csv', mode='r',encoding='utf-8') as f:\n",
139 + " reader = csv.reader(f)\n",
140 + " for row in reader : \n",
141 + " labels_1.append(row)\n",
142 + "labels_1.sort(key=lambda x:x[0])\n",
143 + "labels_1 = np.array(labels_1) #아...그냥이렇게하면 넘피배열로 바꿀수있구나ㅠ\n",
144 + "labels_1 = labels_1[0:-1,1]\n",
145 + "print(\"Done.\")\n",
146 + "\n",
147 + "\n",
148 + "print(\"Preparing walber_labels.\")\n",
149 + "labels_2 = []\n",
150 + "with open(audio_path2+'labels.csv', mode='r',encoding='utf-8') as f:\n",
151 + " reader = csv.reader(f)\n",
152 + " for row in reader : \n",
153 + " labels_2.append(row)\n",
154 + "labels_2.sort(key=lambda x:x[0])\n",
155 + "labels_2 = np.array(labels_2) #아...그냥이렇게하면 넘피배열로 바꿀수있구나ㅠ\n",
156 + "labels_2 = labels_2[0:6000,1]\n",
157 + "print(\"Done.\")\n"
158 + ]
159 + },
160 + {
161 + "cell_type": "code",
162 + "execution_count": 5,
163 + "metadata": {},
164 + "outputs": [
165 + {
166 + "name": "stdout",
167 + "output_type": "stream",
168 + "text": [
169 + "Preparing ff1010_melspectogram.\n",
170 + "part1_done\n",
171 + "part2_done.\n",
172 + "part3_done\n",
173 + "part4_done.\n"
174 + ]
175 + },
176 + {
177 + "data": {
178 + "text/plain": [
179 + "(7690, 20000)"
180 + ]
181 + },
182 + "execution_count": 5,
183 + "metadata": {},
184 + "output_type": "execute_result"
185 + }
186 + ],
187 + "source": [
188 + "\n",
189 + "# prepare ff1010_melspecotograms\n",
190 + "print(\"Preparing ff1010_melspectogram.\")\n",
191 + "mel_spectogram_1 = []\n",
192 + "with open(audio_path+'mel_spec.csv', mode='r',encoding='utf-8') as f:\n",
193 + " reader = csv.reader(f)\n",
194 + " next(reader)\n",
195 + " for row in reader : \n",
196 + " mel_spectogram_1.append(row)\n",
197 + "print('Done')\n",
198 + "\n",
199 + "mel_spectogram_1 = np.array(mel_spectogram_1)\n",
200 + "mel_spectogram_1= mel_spectogram_1[:,1:]\n",
201 + "\n",
202 + "np.shape(mel_spectogram_1)"
203 + ]
204 + },
205 + {
206 + "cell_type": "code",
207 + "execution_count": 6,
208 + "metadata": {},
209 + "outputs": [
210 + {
211 + "name": "stdout",
212 + "output_type": "stream",
213 + "text": [
214 + "Preparing ff1010_melspectogram.\n",
215 + "part1\n",
216 + "part2\n",
217 + "Done.\n"
218 + ]
219 + },
220 + {
221 + "data": {
222 + "text/plain": [
223 + "(6000, 20000)"
224 + ]
225 + },
226 + "execution_count": 6,
227 + "metadata": {},
228 + "output_type": "execute_result"
229 + }
230 + ],
231 + "source": [
232 + "# prepare ff1010_melspecotograms\n",
233 + "print(\"Preparing walber_melspectogram.\")\n",
234 + "mel_spectogram_2 = []\n",
235 + "with open(audio_path2+'mel_spec.csv', mode='r',encoding='utf-8') as f:\n",
236 + " reader = csv.reader(f)\n",
237 + " next(reader)\n",
238 + " for row in reader : \n",
239 + " mel_spectogram_2.append(row)\n",
240 + "print('Done')\n",
241 + "\n",
242 + "\n",
243 + "mel_spectogram_2 = np.array(mel_spectogram_2)\n",
244 + "mel_spectogram_2= mel_spectogram_2[:,1:]\n",
245 + "\n",
246 + "np.shape(mel_spectogram_2)"
247 + ]
248 + },
249 + {
250 + "cell_type": "code",
251 + "execution_count": 7,
252 + "metadata": {},
253 + "outputs": [
254 + {
255 + "data": {
256 + "text/plain": [
257 + "(13690,)"
258 + ]
259 + },
260 + "execution_count": 7,
261 + "metadata": {},
262 + "output_type": "execute_result"
263 + }
264 + ],
265 + "source": [
266 + "\n",
267 + "MODEL_SAVE_FOLDER_PATH = './model/'\n",
268 + "\n",
269 + "if not os.path.exists(MODEL_SAVE_FOLDER_PATH):\n",
270 + " os.mkdir(MODEL_SAVE_FOLDER_PATH)\n",
271 + "\n",
272 + "model_path = MODEL_SAVE_FOLDER_PATH + 'bird_sound-' + '{epoch:02d}-{val_loss:.4f}.hdf5'\n",
273 + "\n",
274 + "cb_checkpoint = ModelCheckpoint(filepath=model_path, monitor='val_loss',\n",
275 + " verbose=1, save_best_only=True)\n",
276 + "\n",
277 + "cb_early_stopping = EarlyStopping(monitor='val_loss', patience=50)\n",
278 + "\n",
279 + "\n",
280 + "ALL_Spectrogram = np.concatenate((mel_spectogram_1,mel_spectogram_2),axis=0) \n",
281 + "X_train = ALL_Spectrogram[:14000,-1]\n",
282 + "X_train = np.reshape(X_train,(14000,40,500,1))\n",
283 + "X_test = ALL_Spectrogram[14000:,-1]\n",
284 + "X_test = np.reshape(X_test,(14000,40,500,1))\n",
285 + "\n",
286 + "ALL_Labels = np.concatenate((labels_1,labels_2),axis=0) \n",
287 + "Y_train = ALL_Labels[:14000,-1]\n",
288 + "Y_train = np.reshape(Y_train,(14000))\n",
289 + "Y_test = ALL_Labels[14000:,-1]\n",
290 + "Y_test = np.reshape(Y_test,(14000))\n",
291 + "np.shape(Y_train)\n",
292 + "\n"
293 + ]
294 + },
295 + {
296 + "cell_type": "code",
297 + "execution_count": 9,
298 + "metadata": {},
299 + "outputs": [
300 + {
301 + "name": "stdout",
302 + "output_type": "stream",
303 + "text": [
304 + "(None, 40, 500, 96)\n",
305 + "(None, 8, 500, 96)\n",
306 + "(None, 8, 500, 96)\n",
307 + "(None, 4, 500, 96)\n",
308 + "(None, 4, 500, 96)\n",
309 + "(None, 2, 500, 96)\n",
310 + "(None, 2, 500, 96)\n",
311 + "(None, 1, 500, 96)\n",
312 + "(None, 96, 500)\n"
313 + ]
314 + },
315 + {
316 + "name": "stderr",
317 + "output_type": "stream",
318 + "text": [
319 + "/home/ubuntu/anaconda3/envs/tensorflow_p36/lib/python3.6/site-packages/ipykernel_launcher.py:54: UserWarning: Update your `GRU` call to the Keras 2 API: `GRU(return_sequences=True, units=500)`\n"
320 + ]
321 + },
322 + {
323 + "name": "stdout",
324 + "output_type": "stream",
325 + "text": [
326 + "(None, 96, 500)\n"
327 + ]
328 + },
329 + {
330 + "name": "stderr",
331 + "output_type": "stream",
332 + "text": [
333 + "/home/ubuntu/anaconda3/envs/tensorflow_p36/lib/python3.6/site-packages/ipykernel_launcher.py:57: UserWarning: Update your `GRU` call to the Keras 2 API: `GRU(return_sequences=True, units=500)`\n"
334 + ]
335 + },
336 + {
337 + "name": "stdout",
338 + "output_type": "stream",
339 + "text": [
340 + "(None, 96, 500)\n",
341 + "(None, 96, 500, 1)\n",
342 + "(None, 96, 1, 1)\n",
343 + "Train on 10267 samples, validate on 3423 samples\n",
344 + "Epoch 1/50\n",
345 + " - 431s - loss: 0.3637 - acc: 0.8467 - val_loss: 0.4091 - val_acc: 0.7885\n",
346 + "\n",
347 + "Epoch 00001: val_loss did not improve from 0.40740\n",
348 + "Epoch 2/50\n"
349 + ]
350 + },
351 + {
352 + "ename": "KeyboardInterrupt",
353 + "evalue": "",
354 + "output_type": "error",
355 + "traceback": [
356 + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
357 + "\u001b[0;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)",
358 + "\u001b[0;32m<ipython-input-9-ff0adce6f8b3>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m()\u001b[0m\n\u001b[1;32m 76\u001b[0m \u001b[0mvalidation_split\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m0.25\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 77\u001b[0m \u001b[0mepochs\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m50\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mbatch_size\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m200\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mverbose\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 78\u001b[0;31m callbacks=[cb_checkpoint, cb_early_stopping])\n\u001b[0m\u001b[1;32m 79\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 80\u001b[0m \u001b[0;31m# print('\\nAccuracy: {:.4f}'.format(model.evaluate(X_validation, Y_validation)[1]))\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
359 + "\u001b[0;32m~/anaconda3/envs/tensorflow_p36/lib/python3.6/site-packages/keras/engine/training.py\u001b[0m in \u001b[0;36mfit\u001b[0;34m(self, x, y, batch_size, epochs, verbose, callbacks, validation_split, validation_data, shuffle, class_weight, sample_weight, initial_epoch, steps_per_epoch, validation_steps, **kwargs)\u001b[0m\n\u001b[1;32m 1040\u001b[0m \u001b[0minitial_epoch\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0minitial_epoch\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1041\u001b[0m \u001b[0msteps_per_epoch\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0msteps_per_epoch\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1042\u001b[0;31m validation_steps=validation_steps)\n\u001b[0m\u001b[1;32m 1043\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1044\u001b[0m def evaluate(self, x=None, y=None,\n",
360 + "\u001b[0;32m~/anaconda3/envs/tensorflow_p36/lib/python3.6/site-packages/keras/engine/training_arrays.py\u001b[0m in \u001b[0;36mfit_loop\u001b[0;34m(model, f, ins, out_labels, batch_size, epochs, verbose, callbacks, val_f, val_ins, shuffle, callback_metrics, initial_epoch, steps_per_epoch, validation_steps)\u001b[0m\n\u001b[1;32m 183\u001b[0m \u001b[0;31m# Do not slice the training phase flag.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 184\u001b[0m ins_batch = slice_arrays(\n\u001b[0;32m--> 185\u001b[0;31m ins[:-1], batch_ids) + [ins[-1]]\n\u001b[0m\u001b[1;32m 186\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 187\u001b[0m \u001b[0mins_batch\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mslice_arrays\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mins\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mbatch_ids\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
361 + "\u001b[0;32m~/anaconda3/envs/tensorflow_p36/lib/python3.6/site-packages/keras/utils/generic_utils.py\u001b[0m in \u001b[0;36mslice_arrays\u001b[0;34m(arrays, start, stop)\u001b[0m\n\u001b[1;32m 505\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mhasattr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mstart\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'shape'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 506\u001b[0m \u001b[0mstart\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mstart\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtolist\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 507\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;32mNone\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mx\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mNone\u001b[0m \u001b[0;32melse\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mstart\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mx\u001b[0m \u001b[0;32min\u001b[0m \u001b[0marrays\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 508\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 509\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;32mNone\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mx\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mNone\u001b[0m \u001b[0;32melse\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mstart\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0mstop\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mx\u001b[0m \u001b[0;32min\u001b[0m \u001b[0marrays\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
362 + "\u001b[0;32m~/anaconda3/envs/tensorflow_p36/lib/python3.6/site-packages/keras/utils/generic_utils.py\u001b[0m in \u001b[0;36m<listcomp>\u001b[0;34m(.0)\u001b[0m\n\u001b[1;32m 505\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mhasattr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mstart\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'shape'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 506\u001b[0m \u001b[0mstart\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mstart\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtolist\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 507\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;32mNone\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mx\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mNone\u001b[0m \u001b[0;32melse\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mstart\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mx\u001b[0m \u001b[0;32min\u001b[0m \u001b[0marrays\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 508\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 509\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;32mNone\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mx\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mNone\u001b[0m \u001b[0;32melse\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mstart\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0mstop\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mx\u001b[0m \u001b[0;32min\u001b[0m \u001b[0marrays\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
363 + "\u001b[0;31mKeyboardInterrupt\u001b[0m: "
364 + ]
365 + }
366 + ],
367 + "source": [
368 + "import keras.backend.tensorflow_backend as K\n",
369 + "def CRNN() : \n",
370 + " model = Sequential()\n",
371 + " model.add(Conv2D(96, kernel_size=(5, 5), input_shape=(40, 500,1), padding='same',activation='relu')) #어쩌면 40,500만해야할지두\n",
372 + " print(model.output_shape)\n",
373 + " model.add(BatchNormalization())\n",
374 + " model.add(MaxPooling2D(pool_size=(5,1)))\n",
375 + " model.add(Dropout(0.25))\n",
376 + " print(model.output_shape)\n",
377 + "\n",
378 + " model.add(Conv2D(96, (5, 5), padding='same',activation='relu'))\n",
379 + " print(model.output_shape)\n",
380 + " model.add(BatchNormalization())\n",
381 + " model.add(MaxPooling2D(pool_size=(2,1)))\n",
382 + " model.add(Dropout(0.25))\n",
383 + " print(model.output_shape)\n",
384 + "\n",
385 + " model.add(Conv2D(96, (5, 5), padding='same',activation='relu'))\n",
386 + " print(model.output_shape)\n",
387 + " model.add(BatchNormalization())\n",
388 + " model.add(MaxPooling2D(pool_size=(2,1)))\n",
389 + " model.add(Dropout(0.25))\n",
390 + " print(model.output_shape)\n",
391 + "\n",
392 + " model.add(Conv2D(96, (5, 5), padding='same', activation='relu'))\n",
393 + " print(model.output_shape)\n",
394 + " model.add(BatchNormalization())\n",
395 + " model.add(MaxPooling2D(pool_size=(2,1)))\n",
396 + " model.add(Dropout(0.25))\n",
397 + " print(model.output_shape)\n",
398 + "\n",
399 + " model.add(Reshape((96,500))) #문제될거같은데..\n",
400 + " print(model.output_shape)\n",
401 + "\n",
402 + " model.add(GRU(output_dim=500, return_sequences=True))\n",
403 + " print(model.output_shape)\n",
404 + "\n",
405 + " model.add(GRU(output_dim=500, return_sequences=True))\n",
406 + " print(model.output_shape)\n",
407 + "\n",
408 + " model.add(Reshape((96,500,1))) #문제될거같은데..2\n",
409 + " print(model.output_shape)\n",
410 + "\n",
411 + " model.add(MaxPooling2D(pool_size=(1,500)))\n",
412 + " print(model.output_shape)\n",
413 + "\n",
414 + " model.add(Flatten())\n",
415 + " model.add(Dense(1, activation='sigmoid'))\n",
416 + " model = multi_gpu_model(gpunum)\n",
417 + " model.compile(loss='binary_crossentropy',\n",
418 + " optimizer='adam',\n",
419 + " metrics=['accuracy'])\n",
420 + " # model.load_weights(MODEL_SAVE_FOLDER_PATH + 'bird_sound-' + '17-0.3943.hdf5')\n",
421 + "\n",
422 + " return model\n",
423 + "\n",
424 + "\n",
425 + "def CRNN_Training(model) : \n",
426 + "\n",
427 + " history = model.fit(X_train, Y_train, \n",
428 + " validation_split=0.25,\n",
429 + " epochs=50, batch_size=64, verbose=2,\n",
430 + " callbacks=[cb_checkpoint, cb_early_stopping])\n",
431 + " \n",
432 + " y_vloss = history.history['val_loss']\n",
433 + " y_loss = history.history['loss']\n",
434 + "\n",
435 + " x_len = numpy.arange(len(y_loss))\n",
436 + " plt.plot(x_len, y_loss, marker='.', c='blue', label=\"Train-set Loss\")\n",
437 + " plt.plot(x_len, y_vloss, marker='.', c='red', label=\"Validation-set Loss\")\n",
438 + "\n",
439 + " plt.legend(loc='upper right')\n",
440 + " plt.grid()\n",
441 + " plt.xlabel('epoch')\n",
442 + " plt.ylabel('loss')\n",
443 + " plt.show()\n",
444 + " \n",
445 + " return model\n",
446 + " \n",
447 + "def CRNN_EVALUATE(model):\n",
448 + " score = model.evaluate(X_test,Y_test,batch_size=64,verbose=2)\n",
449 + " print(\"%s: %.2f%%\" % (model.metrics_names[1], scores[1]*100))\n",
450 + " \n",
451 + " false_positive_rate, true_positive_rate, thresholds = roc_curve(Y_test, model.predict(X_test).ravel())\n",
452 + " print auc(false_positive_rate, true_positive_rate)\n",
453 + " return model\n"
454 + ]
455 + },
456 + {
457 + "cell_type": "code",
458 + "execution_count": null,
459 + "metadata": {},
460 + "outputs": [],
461 + "source": [
462 + "Layer = CRNN()\n",
463 + "Layer = CRNN_Training(Layer)\n",
464 + "Layer = CRNN_EVALUATE(Layer)\n",
465 + "# RECALL이 중요\n",
466 + "# TruePositive / ( TruePositive + TrueNegative )\n"
467 + ]
468 + },
469 + {
470 + "cell_type": "code",
471 + "execution_count": null,
472 + "metadata": {},
473 + "outputs": [],
474 + "source": [
475 + "'''\n",
476 + "Finally,\n",
477 + "for the bulbul submission, from each spectrogram we subtract\n",
478 + "its mean over time, as a simple way of removing frequency-\n",
479 + "dependent (colored) noise\n",
480 + "\n",
481 + "-> time axis의 평균\n",
482 + "'''\n",
483 + "'''\n",
484 + "\n",
485 + "the feature maps\n",
486 + "of the last convolutional layer are stacked over the frequency -> frequency axis\n",
487 + "axis and fed to 2 gated recurrent unit (GRU)\n",
488 + "'''\n",
489 + "\n"
490 + ]
491 + }
492 + ],
493 + "metadata": {
494 + "kernelspec": {
495 + "display_name": "Python 3",
496 + "language": "python",
497 + "name": "python3"
498 + },
499 + "language_info": {
500 + "codemirror_mode": {
501 + "name": "ipython",
502 + "version": 3
503 + },
504 + "file_extension": ".py",
505 + "mimetype": "text/x-python",
506 + "name": "python",
507 + "nbconvert_exporter": "python",
508 + "pygments_lexer": "ipython3",
509 + "version": "3.6.5"
510 + }
511 + },
512 + "nbformat": 4,
513 + "nbformat_minor": 2
514 +}
1 +{
2 + "cells": [
3 + {
4 + "cell_type": "code",
5 + "execution_count": 2,
6 + "metadata": {},
7 + "outputs": [
8 + {
9 + "data": {
10 + "text/plain": [
11 + "'\\n평가방법 : positive를 높이는방식\\n\\n본논문\\n- STFT magnitude Spectrun\\n- n=40 log mel filter bank\\n\\n다른논문\\n-STFT maginitude spectogram\\n- n=80 mel scaled filter bank\\n- scale log magnitude\\n- batch nomalization (0,1)\\n- subtract mean overtime on spectogram (for remove frequency dependency noise = colored noise)\\n'"
12 + ]
13 + },
14 + "execution_count": 2,
15 + "metadata": {},
16 + "output_type": "execute_result"
17 + }
18 + ],
19 + "source": [
20 + "'''\n",
21 + "평가방법 : positive를 높이는방식\n",
22 + "\n",
23 + "본논문\n",
24 + "- STFT magnitude Spectrun\n",
25 + "- n=40 log mel filter bank\n",
26 + "\n",
27 + "다른논문\n",
28 + "-STFT maginitude spectogram\n",
29 + "- n=80 mel scaled filter bank\n",
30 + "- scale log magnitude\n",
31 + "- batch nomalization (0,1)\n",
32 + "- subtract mean overtime on spectogram (for remove frequency dependency noise = colored noise)\n",
33 + "'''"
34 + ]
35 + },
36 + {
37 + "cell_type": "code",
38 + "execution_count": 3,
39 + "metadata": {},
40 + "outputs": [
41 + {
42 + "name": "stderr",
43 + "output_type": "stream",
44 + "text": [
45 + "Using TensorFlow backend.\n"
46 + ]
47 + }
48 + ],
49 + "source": [
50 + "#path 관련 라이브러리\n",
51 + "import glob\n",
52 + "import csv\n",
53 + "\n",
54 + "#csv저장 라이브러리\n",
55 + "import pandas as pd\n",
56 + "\n",
57 + "# Scientific Math 라이브러리 \n",
58 + "import numpy as np\n",
59 + "import librosa\n",
60 + "import librosa.display\n",
61 + "import os\n",
62 + "\n",
63 + "# Visualization 라이브러리\n",
64 + "import matplotlib.pyplot as plt\n",
65 + "import IPython.display as ipd\n",
66 + "\n",
67 + "#keras\n",
68 + "from keras.utils import np_utils\n",
69 + "from keras.models import Sequential\n",
70 + "from keras.layers import Dense, Conv2D, MaxPooling2D, GRU,Dropout, Flatten,Reshape,BatchNormalization\n",
71 + "from keras.callbacks import ModelCheckpoint, EarlyStopping\n",
72 + "\n"
73 + ]
74 + },
75 + {
76 + "cell_type": "code",
77 + "execution_count": 4,
78 + "metadata": {},
79 + "outputs": [],
80 + "source": [
81 + "audio_path = './SOUNDS/warbler/'\n",
82 + "n_mels = 40\n",
83 + "n_frame = 500\n",
84 + "window_size=1024\n",
85 + "hop_size=512\n",
86 + "sample_rate=25600\n",
87 + "num_file = 0 #데이터갯수 이후에 덮어씌워짐"
88 + ]
89 + },
90 + {
91 + "cell_type": "code",
92 + "execution_count": 7,
93 + "metadata": {},
94 + "outputs": [
95 + {
96 + "name": "stdout",
97 + "output_type": "stream",
98 + "text": [
99 + "Preparing file lists.\n",
100 + "Done.\n",
101 + "45\n"
102 + ]
103 + }
104 + ],
105 + "source": [
106 + "#prepare labels\n",
107 + "labels = []\n",
108 + "with open(audio_path+'labels.csv', mode='r',encoding='utf-8') as f:\n",
109 + " reader = csv.reader(f)\n",
110 + " for row in reader : \n",
111 + " labels.append(row)\n",
112 + "labels.sort(key=lambda x:x[0])\n",
113 + "labels = np.array(labels) \n",
114 + "labels = labels[0:-1,1]\n",
115 + "\n",
116 + "# prepare file lists\n",
117 + "print(\"Preparing file lists.\")\n",
118 + "dirs = []\n",
119 + "for filename in glob.glob(audio_path+'wav/'+'*.wav'):\n",
120 + " dirs.append(filename)\n",
121 + "dirs.sort()\n",
122 + "print(\"Done.\")\n",
123 + "\n",
124 + "num_file = len(dirs)"
125 + ]
126 + },
127 + {
128 + "cell_type": "code",
129 + "execution_count": 5,
130 + "metadata": {
131 + "scrolled": false
132 + },
133 + "outputs": [
134 + {
135 + "data": {
136 + "image/png": "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\n",
137 + "text/plain": [
138 + "<Figure size 720x288 with 2 Axes>"
139 + ]
140 + },
141 + "metadata": {},
142 + "output_type": "display_data"
143 + }
144 + ],
145 + "source": [
146 + "#librosa spectogram_Checking\n",
147 + "\n",
148 + "S=librosa.feature.melspectrogram(y=y, sr=sr,n_fft=window_size, hop_length=hop_size, power=2.0, n_mels=40)\n",
149 + "S=S[:,0:500]\n",
150 + "\n",
151 + "plt.figure(figsize=(10,4))\n",
152 + "librosa.display.specshow(librosa.power_to_db(S,ref=np.max),y_axis='mel',x_axis='time')\n",
153 + "plt.colorbar(format='%+2.0f dB')\n",
154 + "plt.title('Mel Spectogram')\n",
155 + "plt.tight_layout()"
156 + ]
157 + },
158 + {
159 + "cell_type": "code",
160 + "execution_count": 8,
161 + "metadata": {},
162 + "outputs": [
163 + {
164 + "name": "stdout",
165 + "output_type": "stream",
166 + "text": [
167 + "making mel_spectogram.\n",
168 + "1000\n",
169 + "2000\n",
170 + "3000\n",
171 + "4000\n",
172 + "5000\n",
173 + "6000\n",
174 + "7000\n",
175 + "8000\n"
176 + ]
177 + }
178 + ],
179 + "source": [
180 + "print('making mel_spectogram.')\n",
181 + "mel_spectogram = []\n",
182 + "count = 0\n",
183 + "for direct in dirs:\n",
184 + " y,sr=librosa.core.load(direct,sr=sample_rate)\n",
185 + " S=librosa.feature.melspectrogram(y=y, sr=sr,n_fft=window_size, hop_length=hop_size, power=2.0, n_mels=40)\n",
186 + " if np.shape(S)[1]<500 : \n",
187 + " S = np.concatenate((S,S),axis=1)\n",
188 + " S=S[:,0:500] \n",
189 + " mel_spectogram.append(S)\n",
190 + " count= count+1\n",
191 + " if(count%1000==0) :\n",
192 + " print(count)\n",
193 + "print('done')\n",
194 + "\n",
195 + "#np배열로 바꿔줌\n",
196 + "mel_spectogram=np.array(mel_spectogram)"
197 + ]
198 + },
199 + {
200 + "cell_type": "code",
201 + "execution_count": 19,
202 + "metadata": {},
203 + "outputs": [
204 + {
205 + "name": "stdout",
206 + "output_type": "stream",
207 + "text": [
208 + "581\n",
209 + "2451\n",
210 + "4721\n",
211 + "5115\n"
212 + ]
213 + },
214 + {
215 + "data": {
216 + "text/plain": [
217 + "(40, 98)"
218 + ]
219 + },
220 + "execution_count": 19,
221 + "metadata": {},
222 + "output_type": "execute_result"
223 + }
224 + ],
225 + "source": [
226 + "# 10초 이하인거는 반복해서 10초로 길이 늘려주기\n",
227 + "for i in range(0,num_file) : \n",
228 + " if np.shape(mel_spectogram[i])[1] != 500:\n",
229 + " mel_spectogram[i] = np.concatenate((mel_spectogram[i],mel_spectogram[i]),axis=1)\n",
230 + " mel_spectogram[i] = np.concatenate((mel_spectogram[i],mel_spectogram[i]),axis=1)\n",
231 + " mel_spectogram[i] = (mel_spectogram[i]) [:,0:500]\n",
232 + " np.shape(mel_spectogram[i])\n",
233 + " "
234 + ]
235 + },
236 + {
237 + "cell_type": "code",
238 + "execution_count": 30,
239 + "metadata": {},
240 + "outputs": [],
241 + "source": [
242 + "#csv파일로 저장하려고 2차원배월로 만듬\n",
243 + "mel_spectogram=np.reshape(mel_spectogram,(np.shape(mel_spectogram)[0],-1))\n",
244 + "df = pd.DataFrame(mel_spectogram[0:num_file,:])\n",
245 + "df.to_csv(audio_path+\"/mel_spec.csv\")\n",
246 + "\n",
247 + "if(np.shape(labels)[0]!=num_file) :\n",
248 + " print('something wrong')"
249 + ]
250 + }
251 + ],
252 + "metadata": {
253 + "kernelspec": {
254 + "display_name": "Python 3",
255 + "language": "python",
256 + "name": "python3"
257 + },
258 + "language_info": {
259 + "codemirror_mode": {
260 + "name": "ipython",
261 + "version": 3
262 + },
263 + "file_extension": ".py",
264 + "mimetype": "text/x-python",
265 + "name": "python",
266 + "nbconvert_exporter": "python",
267 + "pygments_lexer": "ipython3",
268 + "version": "3.6.5"
269 + }
270 + },
271 + "nbformat": 4,
272 + "nbformat_minor": 2
273 +}
1 +{
2 + "cells": [
3 + {
4 + "cell_type": "code",
5 + "execution_count": 2,
6 + "metadata": {},
7 + "outputs": [
8 + {
9 + "data": {
10 + "text/plain": [
11 + "'\\n평가방법 : positive를 높이는방식\\n\\n본논문\\n- STFT magnitude Spectrun\\n- n=40 log mel filter bank\\n\\n다른논문\\n-STFT maginitude spectogram\\n- n=80 mel scaled filter bank\\n- scale log magnitude\\n- batch nomalization (0,1)\\n- subtract mean overtime on spectogram (for remove frequency dependency noise = colored noise)\\n'"
12 + ]
13 + },
14 + "execution_count": 2,
15 + "metadata": {},
16 + "output_type": "execute_result"
17 + }
18 + ],
19 + "source": [
20 + "'''\n",
21 + "평가방법 : positive를 높이는방식\n",
22 + "\n",
23 + "본논문\n",
24 + "- STFT magnitude Spectrun\n",
25 + "- n=40 log mel filter bank\n",
26 + "\n",
27 + "다른논문\n",
28 + "-STFT maginitude spectogram\n",
29 + "- n=80 mel scaled filter bank\n",
30 + "- scale log magnitude\n",
31 + "- batch nomalization (0,1)\n",
32 + "- subtract mean overtime on spectogram (for remove frequency dependency noise = colored noise)\n",
33 + "'''"
34 + ]
35 + },
36 + {
37 + "cell_type": "code",
38 + "execution_count": 1,
39 + "metadata": {},
40 + "outputs": [
41 + {
42 + "name": "stdout",
43 + "output_type": "stream",
44 + "text": [
45 + "[name: \"/device:CPU:0\"\n",
46 + "device_type: \"CPU\"\n",
47 + "memory_limit: 268435456\n",
48 + "locality {\n",
49 + "}\n",
50 + "incarnation: 6180456371412583691\n",
51 + "]\n"
52 + ]
53 + }
54 + ],
55 + "source": [
56 + "from tensorflow.python.client import device_lib\n",
57 + "print(device_lib.list_local_devices())\n",
58 + "\n",
59 + "from keras.utils.training_utils import multi_gpu_model\n",
60 + "gpunum = 0"
61 + ]
62 + },
63 + {
64 + "cell_type": "code",
65 + "execution_count": 2,
66 + "metadata": {},
67 + "outputs": [
68 + {
69 + "name": "stderr",
70 + "output_type": "stream",
71 + "text": [
72 + "Using TensorFlow backend.\n"
73 + ]
74 + }
75 + ],
76 + "source": [
77 + "#path 관련 라이브러리\n",
78 + "import glob\n",
79 + "import csv\n",
80 + "\n",
81 + "#csv저장 라이브러리\n",
82 + "import pandas as pd\n",
83 + "\n",
84 + "# Scientific Math 라이브러리 \n",
85 + "import numpy as np\n",
86 + "import librosa\n",
87 + "import librosa.display\n",
88 + "import os\n",
89 + "\n",
90 + "# Visualization 라이브러리\n",
91 + "import matplotlib.pyplot as plt\n",
92 + "import IPython.display as ipd\n",
93 + "\n",
94 + "#keras\n",
95 + "from keras.utils import np_utils\n",
96 + "from keras.models import Sequential\n",
97 + "from keras.layers import Dense, Conv2D, MaxPooling2D, GRU,Dropout, Flatten,Reshape,BatchNormalization\n",
98 + "from keras.callbacks import ModelCheckpoint, EarlyStopping\n"
99 + ]
100 + },
101 + {
102 + "cell_type": "code",
103 + "execution_count": 7,
104 + "metadata": {},
105 + "outputs": [],
106 + "source": [
107 + "audio_path2= './SOUNDS/warbler/'\n",
108 + "n_mels = 40\n",
109 + "n_frame = 500\n",
110 + "window_size=1024\n",
111 + "hop_size=512\n",
112 + "sample_rate=25600"
113 + ]
114 + },
115 + {
116 + "cell_type": "code",
117 + "execution_count": 8,
118 + "metadata": {},
119 + "outputs": [
120 + {
121 + "name": "stdout",
122 + "output_type": "stream",
123 + "text": [
124 + "Preparing walber_test_labels.\n",
125 + "Done.\n"
126 + ]
127 + }
128 + ],
129 + "source": [
130 + "print(\"Preparing walber_test_labels.\")\n",
131 + "labels_2 = []\n",
132 + "with open(audio_path2+'labels.csv', mode='r',encoding='utf-8') as f:\n",
133 + " reader = csv.reader(f)\n",
134 + " for row in reader : \n",
135 + " labels_2.append(row)\n",
136 + "labels_2.sort(key=lambda x:x[0])\n",
137 + "labels_2 = np.array(labels_2) #아...그냥이렇게하면 넘피배열로 바꿀수있구나ㅠ\n",
138 + "labels_2 = labels_2[6000:-1,1]\n",
139 + "print(\"Done.\")\n"
140 + ]
141 + },
142 + {
143 + "cell_type": "code",
144 + "execution_count": 9,
145 + "metadata": {},
146 + "outputs": [
147 + {
148 + "name": "stdout",
149 + "output_type": "stream",
150 + "text": [
151 + "Preparing walber_melspectogram.\n",
152 + "Done.\n"
153 + ]
154 + },
155 + {
156 + "ename": "KeyboardInterrupt",
157 + "evalue": "",
158 + "output_type": "error",
159 + "traceback": [
160 + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
161 + "\u001b[0;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)",
162 + "\u001b[0;32m<ipython-input-9-8d8dc96f9568>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m()\u001b[0m\n\u001b[1;32m 9\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"Done.\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 10\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 11\u001b[0;31m \u001b[0mmel_spectogram_2\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0marray\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmel_spectogram_2\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 12\u001b[0m \u001b[0mmel_spectogram_2\u001b[0m\u001b[0;34m=\u001b[0m \u001b[0mmel_spectogram_2\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 13\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
163 + "\u001b[0;31mKeyboardInterrupt\u001b[0m: "
164 + ]
165 + }
166 + ],
167 + "source": [
168 + "# prepare waober_test_melspectogram\n",
169 + "print(\"Preparing walber_melspectogram.\")\n",
170 + "mel_spectogram_2 = []\n",
171 + "with open(audio_path2+'mel_spec_4.csv', mode='r',encoding='utf-8') as f:\n",
172 + " reader = csv.reader(f)\n",
173 + " next(reader)\n",
174 + " for row in reader : \n",
175 + " mel_spectogram_2.append(row)\n",
176 + "print(\"Done.\")\n",
177 + "\n",
178 + "mel_spectogram_2 = np.array(mel_spectogram_2)\n",
179 + "mel_spectogram_2= mel_spectogram_2[:,1:]\n",
180 + "\n",
181 + "np.shape(mel_spectogram_2)"
182 + ]
183 + },
184 + {
185 + "cell_type": "code",
186 + "execution_count": 6,
187 + "metadata": {},
188 + "outputs": [],
189 + "source": [
190 + "X_test = np.reshape(mel_spectogram_2,(2000,40,500,1))\n",
191 + "np.shape(X_test)\n",
192 + "\n",
193 + "Y_test = labels_2\n",
194 + "np.shape(Y_test)\n",
195 + "\n",
196 + "MODEL_SAVE_FOLDER_PATH = './model/'"
197 + ]
198 + },
199 + {
200 + "cell_type": "code",
201 + "execution_count": 7,
202 + "metadata": {},
203 + "outputs": [
204 + {
205 + "name": "stdout",
206 + "output_type": "stream",
207 + "text": [
208 + "(None, 40, 500, 96)\n",
209 + "(None, 8, 500, 96)\n",
210 + "(None, 8, 500, 96)\n",
211 + "(None, 4, 500, 96)\n",
212 + "(None, 4, 500, 96)\n",
213 + "(None, 2, 500, 96)\n",
214 + "(None, 2, 500, 96)\n",
215 + "(None, 1, 500, 96)\n",
216 + "(None, 96, 500)\n"
217 + ]
218 + },
219 + {
220 + "name": "stderr",
221 + "output_type": "stream",
222 + "text": [
223 + "/home/ubuntu/anaconda3/envs/tensorflow_p36/lib/python3.6/site-packages/ipykernel_launcher.py:37: UserWarning: Update your `GRU` call to the Keras 2 API: `GRU(return_sequences=True, units=500)`\n"
224 + ]
225 + },
226 + {
227 + "name": "stdout",
228 + "output_type": "stream",
229 + "text": [
230 + "(None, 96, 500)\n"
231 + ]
232 + },
233 + {
234 + "name": "stderr",
235 + "output_type": "stream",
236 + "text": [
237 + "/home/ubuntu/anaconda3/envs/tensorflow_p36/lib/python3.6/site-packages/ipykernel_launcher.py:40: UserWarning: Update your `GRU` call to the Keras 2 API: `GRU(return_sequences=True, units=500)`\n"
238 + ]
239 + },
240 + {
241 + "name": "stdout",
242 + "output_type": "stream",
243 + "text": [
244 + "(None, 96, 500)\n",
245 + "(None, 96, 500, 1)\n",
246 + "(None, 96, 1, 1)\n",
247 + "[0.40238386690616607, 0.8035000026226043]\n"
248 + ]
249 + }
250 + ],
251 + "source": [
252 + "\n",
253 + "import keras.backend.tensorflow_backend as K\n",
254 + "with K.tf.device('/device:GPU:0'):\n",
255 + "\n",
256 + " model = Sequential()\n",
257 + " model.add(Conv2D(96, kernel_size=(5, 5), input_shape=(40, 500,1), padding='same',activation='relu')) #어쩌면 40,500만해야할지두\n",
258 + " print(model.output_shape)\n",
259 + " model.add(BatchNormalization())\n",
260 + " model.add(MaxPooling2D(pool_size=(5,1)))\n",
261 + " model.add(Dropout(0.25))\n",
262 + " print(model.output_shape)\n",
263 + "\n",
264 + " model.add(Conv2D(96, (5, 5), padding='same',activation='relu'))\n",
265 + " print(model.output_shape)\n",
266 + " model.add(BatchNormalization())\n",
267 + " model.add(MaxPooling2D(pool_size=(2,1)))\n",
268 + " model.add(Dropout(0.25))\n",
269 + " print(model.output_shape)\n",
270 + "\n",
271 + " model.add(Conv2D(96, (5, 5), padding='same',activation='relu'))\n",
272 + " print(model.output_shape)\n",
273 + " model.add(BatchNormalization())\n",
274 + " model.add(MaxPooling2D(pool_size=(2,1)))\n",
275 + " model.add(Dropout(0.25))\n",
276 + " print(model.output_shape)\n",
277 + "\n",
278 + " model.add(Conv2D(96, (5, 5), padding='same', activation='relu'))\n",
279 + " print(model.output_shape)\n",
280 + " model.add(BatchNormalization())\n",
281 + " model.add(MaxPooling2D(pool_size=(2,1)))\n",
282 + " model.add(Dropout(0.25))\n",
283 + " print(model.output_shape)\n",
284 + "\n",
285 + " model.add(Reshape((96,500))) #문제될거같은데..\n",
286 + " print(model.output_shape)\n",
287 + "\n",
288 + " model.add(GRU(output_dim=500, return_sequences=True))\n",
289 + " print(model.output_shape)\n",
290 + "\n",
291 + " model.add(GRU(output_dim=500, return_sequences=True))\n",
292 + " print(model.output_shape)\n",
293 + "\n",
294 + " model.add(Reshape((96,500,1))) #문제될거같은데..2\n",
295 + " print(model.output_shape)\n",
296 + "\n",
297 + " model.add(MaxPooling2D(pool_size=(1,500)))\n",
298 + " print(model.output_shape)\n",
299 + "\n",
300 + " model.add(Flatten())\n",
301 + " model.add(Dense(1, activation='sigmoid'))\n",
302 + "\n",
303 + " model.compile(loss='binary_crossentropy',\n",
304 + " optimizer='adam',\n",
305 + " metrics=['accuracy'])\n",
306 + "\n",
307 + " model.load_weights(MODEL_SAVE_FOLDER_PATH + 'bird_sound-' + '17-0.3943.hdf5')\n",
308 + "\n",
309 + " score = model.evaluate(X_test,Y_test,batch_size=200,verbose=2)\n",
310 + " print(\"%s: %.2f%%\" % (model.metrics_names[1], scores[1]*100))"
311 + ]
312 + }
313 + ],
314 + "metadata": {
315 + "kernelspec": {
316 + "display_name": "Python 3",
317 + "language": "python",
318 + "name": "python3"
319 + },
320 + "language_info": {
321 + "codemirror_mode": {
322 + "name": "ipython",
323 + "version": 3
324 + },
325 + "file_extension": ".py",
326 + "mimetype": "text/x-python",
327 + "name": "python",
328 + "nbconvert_exporter": "python",
329 + "pygments_lexer": "ipython3",
330 + "version": "3.6.5"
331 + }
332 + },
333 + "nbformat": 4,
334 + "nbformat_minor": 2
335 +}
This diff could not be displayed because it is too large.
This diff could not be displayed because it is too large.
This diff could not be displayed because it is too large.
This diff could not be displayed because it is too large.
This file is too large to display.
1 +{
2 + "cells": [
3 + {
4 + "cell_type": "code",
5 + "execution_count": 2,
6 + "metadata": {},
7 + "outputs": [],
8 + "source": [
9 + "import pyaudio\n",
10 + "import wave"
11 + ]
12 + },
13 + {
14 + "cell_type": "code",
15 + "execution_count": 6,
16 + "metadata": {},
17 + "outputs": [
18 + {
19 + "name": "stdout",
20 + "output_type": "stream",
21 + "text": [
22 + "* recording\n",
23 + "* done recording\n"
24 + ]
25 + }
26 + ],
27 + "source": [
28 + "CHUNK = 1024\n",
29 + "FORMAT = pyaudio.paInt16\n",
30 + "CHANNELS = 1\n",
31 + "RATE = 25600\n",
32 + "RECORD_SECONDS = 10\n",
33 + "WAVE_OUTPUT_FILENAME = \"test.wav\"\n",
34 + "\n",
35 + "p = pyaudio.PyAudio()\n",
36 + "\n",
37 + "stream = p.open(format=FORMAT,\n",
38 + " channels=CHANNELS,\n",
39 + " rate=RATE,\n",
40 + " input=True,\n",
41 + " frames_per_buffer=CHUNK)\n",
42 + "\n",
43 + "print(\"* recording\")\n",
44 + "\n",
45 + "frames = []\n",
46 + "\n",
47 + "for i in range(0, int(RATE / CHUNK * RECORD_SECONDS)):\n",
48 + " data = stream.read(CHUNK)\n",
49 + " frames.append(data)\n",
50 + "\n",
51 + "print(\"* done recording\")\n",
52 + "\n",
53 + "stream.stop_stream()\n",
54 + "stream.close()\n",
55 + "p.terminate()\n",
56 + "\n",
57 + "wf = wave.open(WAVE_OUTPUT_FILENAME, 'wb')\n",
58 + "wf.setnchannels(CHANNELS)\n",
59 + "wf.setsampwidth(p.get_sample_size(FORMAT))\n",
60 + "wf.setframerate(RATE)\n",
61 + "wf.writeframes(b''.join(frames))\n",
62 + "wf.close()"
63 + ]
64 + },
65 + {
66 + "cell_type": "code",
67 + "execution_count": null,
68 + "metadata": {},
69 + "outputs": [],
70 + "source": []
71 + },
72 + {
73 + "cell_type": "code",
74 + "execution_count": null,
75 + "metadata": {},
76 + "outputs": [],
77 + "source": []
78 + }
79 + ],
80 + "metadata": {
81 + "kernelspec": {
82 + "display_name": "Python 3",
83 + "language": "python",
84 + "name": "python3"
85 + },
86 + "language_info": {
87 + "codemirror_mode": {
88 + "name": "ipython",
89 + "version": 3
90 + },
91 + "file_extension": ".py",
92 + "mimetype": "text/x-python",
93 + "name": "python",
94 + "nbconvert_exporter": "python",
95 + "pygments_lexer": "ipython3",
96 + "version": "3.6.5"
97 + }
98 + },
99 + "nbformat": 4,
100 + "nbformat_minor": 2
101 +}
1 +{
2 + "cells": [
3 + {
4 + "cell_type": "code",
5 + "execution_count": 2,
6 + "metadata": {},
7 + "outputs": [],
8 + "source": [
9 + "import pydub"
10 + ]
11 + },
12 + {
13 + "cell_type": "code",
14 + "execution_count": 4,
15 + "metadata": {},
16 + "outputs": [
17 + {
18 + "name": "stdout",
19 + "output_type": "stream",
20 + "text": [
21 + "done\n"
22 + ]
23 + }
24 + ],
25 + "source": [
26 + "from pydub import AudioSegment\n",
27 + "\n",
28 + "for i in range(0,45):\n",
29 + " t1 = i * 10000 #Works in milliseconds\n",
30 + " t2 = (i+1) * 10000\n",
31 + " \n",
32 + " newAudio = AudioSegment.from_wav(\"./New/IMG_3867.wav\")\n",
33 + " newAudio = newAudio[t1:t2]\n",
34 + " newAudio.export('./field/IMG_3867%d.wav'%(i), format=\"wav\")\n",
35 + "\n",
36 + "print('done')"
37 + ]
38 + },
39 + {
40 + "cell_type": "code",
41 + "execution_count": null,
42 + "metadata": {},
43 + "outputs": [],
44 + "source": []
45 + }
46 + ],
47 + "metadata": {
48 + "kernelspec": {
49 + "display_name": "Python 3",
50 + "language": "python",
51 + "name": "python3"
52 + },
53 + "language_info": {
54 + "codemirror_mode": {
55 + "name": "ipython",
56 + "version": 3
57 + },
58 + "file_extension": ".py",
59 + "mimetype": "text/x-python",
60 + "name": "python",
61 + "nbconvert_exporter": "python",
62 + "pygments_lexer": "ipython3",
63 + "version": "3.6.5"
64 + }
65 + },
66 + "nbformat": 4,
67 + "nbformat_minor": 2
68 +}