summaryrefslogtreecommitdiff
path: root/notebooks/grid_frequency_spectra.ipynb
blob: 003c9078468057094dec1d3116fbaccdfb40bd34 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import csv\n",
    "\n",
    "import numpy as np\n",
    "from matplotlib import pyplot as plt\n",
    "import scipy.fftpack"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "%matplotlib widget"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "ename": "FileNotFoundError",
     "evalue": "data/Netzfrequenz_Sekundenwerte_2012_KW37.csv not found.",
     "output_type": "error",
     "traceback": [
      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[0;31mFileNotFoundError\u001b[0m                         Traceback (most recent call last)",
      "Input \u001b[0;32mIn [3]\u001b[0m, in \u001b[0;36m<cell line: 1>\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0m data \u001b[38;5;241m=\u001b[39m \u001b[43mnp\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mgenfromtxt\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mdata/Netzfrequenz_Sekundenwerte_2012_KW37.csv\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mdelimiter\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43m,\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m)\u001b[49m[\u001b[38;5;241m1\u001b[39m:,\u001b[38;5;241m1\u001b[39m:]\n",
      "File \u001b[0;32m/usr/lib/python3.10/site-packages/numpy/lib/npyio.py:1813\u001b[0m, in \u001b[0;36mgenfromtxt\u001b[0;34m(fname, dtype, comments, delimiter, skip_header, skip_footer, converters, missing_values, filling_values, usecols, names, excludelist, deletechars, replace_space, autostrip, case_sensitive, defaultfmt, unpack, usemask, loose, invalid_raise, max_rows, encoding, like)\u001b[0m\n\u001b[1;32m   1811\u001b[0m     fname \u001b[38;5;241m=\u001b[39m os_fspath(fname)\n\u001b[1;32m   1812\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(fname, \u001b[38;5;28mstr\u001b[39m):\n\u001b[0;32m-> 1813\u001b[0m     fid \u001b[38;5;241m=\u001b[39m \u001b[43mnp\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mlib\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_datasource\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mopen\u001b[49m\u001b[43m(\u001b[49m\u001b[43mfname\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mrt\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mencoding\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mencoding\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m   1814\u001b[0m     fid_ctx \u001b[38;5;241m=\u001b[39m contextlib\u001b[38;5;241m.\u001b[39mclosing(fid)\n\u001b[1;32m   1815\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n",
      "File \u001b[0;32m/usr/lib/python3.10/site-packages/numpy/lib/_datasource.py:193\u001b[0m, in \u001b[0;36mopen\u001b[0;34m(path, mode, destpath, encoding, newline)\u001b[0m\n\u001b[1;32m    156\u001b[0m \u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[1;32m    157\u001b[0m \u001b[38;5;124;03mOpen `path` with `mode` and return the file object.\u001b[39;00m\n\u001b[1;32m    158\u001b[0m \n\u001b[0;32m   (...)\u001b[0m\n\u001b[1;32m    189\u001b[0m \n\u001b[1;32m    190\u001b[0m \u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[1;32m    192\u001b[0m ds \u001b[38;5;241m=\u001b[39m DataSource(destpath)\n\u001b[0;32m--> 193\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mds\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mopen\u001b[49m\u001b[43m(\u001b[49m\u001b[43mpath\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mmode\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mencoding\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mencoding\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mnewline\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mnewline\u001b[49m\u001b[43m)\u001b[49m\n",
      "File \u001b[0;32m/usr/lib/python3.10/site-packages/numpy/lib/_datasource.py:532\u001b[0m, in \u001b[0;36mDataSource.open\u001b[0;34m(self, path, mode, encoding, newline)\u001b[0m\n\u001b[1;32m    529\u001b[0m     \u001b[38;5;28;01mreturn\u001b[39;00m _file_openers[ext](found, mode\u001b[38;5;241m=\u001b[39mmode,\n\u001b[1;32m    530\u001b[0m                               encoding\u001b[38;5;241m=\u001b[39mencoding, newline\u001b[38;5;241m=\u001b[39mnewline)\n\u001b[1;32m    531\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m--> 532\u001b[0m     \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mFileNotFoundError\u001b[39;00m(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mpath\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m not found.\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n",
      "\u001b[0;31mFileNotFoundError\u001b[0m: data/Netzfrequenz_Sekundenwerte_2012_KW37.csv not found."
     ]
    }
   ],
   "source": [
    "data = np.genfromtxt('data/Netzfrequenz_Sekundenwerte_2012_KW37.csv', delimiter=',')[1:,1:]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "ename": "NameError",
     "evalue": "name 'data' is not defined",
     "output_type": "error",
     "traceback": [
      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[0;31mNameError\u001b[0m                                 Traceback (most recent call last)",
      "Input \u001b[0;32mIn [4]\u001b[0m, in \u001b[0;36m<cell line: 2>\u001b[0;34m()\u001b[0m\n\u001b[1;32m      1\u001b[0m fig, ax \u001b[38;5;241m=\u001b[39m plt\u001b[38;5;241m.\u001b[39msubplots()\n\u001b[0;32m----> 2\u001b[0m ax\u001b[38;5;241m.\u001b[39mplot(\u001b[43mdata\u001b[49m[:\u001b[38;5;241m3600\u001b[39m\u001b[38;5;241m*\u001b[39m\u001b[38;5;241m24\u001b[39m, \u001b[38;5;241m0\u001b[39m])\n",
      "\u001b[0;31mNameError\u001b[0m: name 'data' is not defined"
     ]
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "bbdb71a2ba2947919ddca69963f54445",
       "version_major": 2,
       "version_minor": 0
      },
      "image/png": "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irEe4sM6duxYXHzxxbFly5b4y7/8y8H1e++9N/bs2RPbtm0bds7tt98ev//972PLli2Dazt27IiFCxfGa6+9FpMnTx52zsDAQAwMDAw+7+/vj2nTpkVfX1/U1tae51cFAIyG/v7+qKurS339Los7gFVVVdHQ0BDt7e1D1tvb26OxsXHEc955550YN27oyx8/fnxEvHfncCTV1dVRW1s75AEA8FFTFgEYEdHS0hKPPvpobNy4Mfbt2xcrVqyIrq6uwbd0V61aFUuXLh08/pZbbolnnnkm1q9fH/v374+XXnopli1bFvPmzYspU6aM1csAABh1lWM9wPmyZMmSOHLkSKxduza6u7tj9uzZ0dbWFtOnT4+IiO7u7iGfCXjnnXfG0aNH48c//nH83d/9XXzsYx+L6667Lr73ve+N1UsAACiJsvgZwLHiZwgA4KPH9buM3gIGAODMCEAAgGQEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkhGAAADJCEAAgGQEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkhGAAADJCEAAgGQEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkhGAAADJCEAAgGQEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkhGAAADJCEAAgGQEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkhGAAADJCEAAgGQEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkhGAAADJCEAAgGQEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkhGAAADJCEAAgGQEIABAMgIQACAZAQgAkIwABABIRgACACRTVgG4bt26mDFjRtTU1ERDQ0Ns3779fY8fGBiI1atXx/Tp06O6ujo++clPxsaNG0s0LQDA2Kgc6wHOl82bN8fy5ctj3bp1ce2118ZPfvKTWLRoUezduzeuvPLKEc+59dZb4/XXX48NGzbEn/zJn8Thw4fj+PHjJZ4cAKC0KoqiKMZ6iPNh/vz5MWfOnFi/fv3g2qxZs2Lx4sXR2to67PgXXnghvvKVr8T+/fvj0ksvPaev2d/fH3V1ddHX1xe1tbXnPDsAUDqu32XyFvCxY8eio6Mjmpqahqw3NTXFzp07Rzzn+eefj7lz58b3v//9uOKKK+Lqq6+O++67L373u9+d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345ly5bF008/XeLJAQBKq6IoimKshzgf5s+fH3PmzIn169cPrs2aNSsWL14cra2tw47/1re+Fc8//3zs27dvcK25uTl++ctfxq5du87oa/b390ddXV309fVFbW3th38RAMCoc/2OqBzrAc6HY8eORUdHR6xcuXLIelNTU+zcuXPEc3bt2hVNTU1D1m688cbYsGFDvPvuuzFhwoRh5wwMDMTAwMDg876+voh4718kAOCj4dR1u0zugZ2TsgjA3t7eOHHiRNTX1w9Zr6+vj56enhHP6enpGfH448ePR29vb0yePHnYOa2trbFmzZph69OmTfsQ0wMAY+HIkSNRV1c31mOMibIIwFMqKiqGPC+KYtjaBx0/0vopq1atipaWlsHnb775ZkyfPj26urrS/gt0oejv749p06bFwYMH097Ov1DYiwuL/bhw2IsLR19fX1x55ZVx6aWXjvUoY6YsAnDSpEkxfvz4YXf7Dh8+POwu3ymXX375iMdXVlbGxIkTRzynuro6qqurh63X1dX5Zr5A1NbW2osLhL24sNiPC4e9uHCMG1c2vwt71srilVdVVUVDQ0O0t7cPWW9vb4/GxsYRz1mwYMGw47du3Rpz584d8ef/AADKRVkEYERES0tLPProo7Fx48bYt29frFixIrq6uqK5uTki3nv7dunSpYPHNzc3x6uvvhotLS2xb9++2LhxY2zYsCHuu+++sXoJAAAlURZvAUdELFmyJI4cORJr166N7u7umD17drS1tcX06dMjIqK7u3vIZwLOmDEj2traYsWKFfHwww/HlClT4qGHHoovf/nLZ/w1q6ur44EHHhjxbWFKy15cOOzFhcV+XDjsxYXDXpTR5wACAHBmyuYtYAAAzowABABIRgACACQjAAEAkhGAH2DdunUxY8aMqKmpiYaGhti+ffv7Hr9t27ZoaGiImpqamDlzZjzyyCMlmrT8nc1ePPPMM3HDDTfExz/+8aitrY0FCxbEL37xixJOW97O9vvilJdeeikqKyvjc5/73OgOmMjZ7sXAwECsXr06pk+fHtXV1fHJT34yNm7cWKJpy9/Z7semTZvimmuuiYsvvjgmT54cd911Vxw5cqRE05anF198MW655ZaYMmVKVFRUxHPPPfeB56S8dhec1j//8z8XEyZMKH72s58Ve/fuLe69997ikksuKV599dURj9+/f39x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",
      "text/html": [
       "\n",
       "            <div style=\"display: inline-block;\">\n",
       "                <div class=\"jupyter-widgets widget-label\" style=\"text-align: center;\">\n",
       "                    Figure\n",
       "                </div>\n",
       "                <img src='data:image/png;base64,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irEe4sM6duxYXHzxxbFly5b4y7/8y8H1e++9N/bs2RPbtm0bds7tt98ev//972PLli2Dazt27IiFCxfGa6+9FpMnTx52zsDAQAwMDAw+7+/vj2nTpkVfX1/U1tae51cFAIyG/v7+qKurS339Los7gFVVVdHQ0BDt7e1D1tvb26OxsXHEc955550YN27oyx8/fnxEvHfncCTV1dVRW1s75AEA8FFTFgEYEdHS0hKPPvpobNy4Mfbt2xcrVqyIrq6uwbd0V61aFUuXLh08/pZbbolnnnkm1q9fH/v374+XXnopli1bFvPmzYspU6aM1csAABh1lWM9wPmyZMmSOHLkSKxduza6u7tj9uzZ0dbWFtOnT4+IiO7u7iGfCXjnnXfG0aNH48c//nH83d/9XXzsYx+L6667Lr73ve+N1UsAACiJsvgZwLHiZwgA4KPH9buM3gIGAODMCEAAgGQEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkhGAAADJCEAAgGQEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkhGAAADJCEAAgGQEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkhGAAADJCEAAgGQEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkhGAAADJCEAAgGQEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkhGAAADJCEAAgGQEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkhGAAADJCEAAgGQEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkhGAAADJCEAAgGQEIABAMgIQACAZAQgAkIwABABIRgACACRTVgG4bt26mDFjRtTU1ERDQ0Ns3779fY8fGBiI1atXx/Tp06O6ujo++clPxsaNG0s0LQDA2Kgc6wHOl82bN8fy5ctj3bp1ce2118ZPfvKTWLRoUezduzeuvPLKEc+59dZb4/XXX48NGzbEn/zJn8Thw4fj+PHjJZ4cAKC0KoqiKMZ6iPNh/vz5MWfOnFi/fv3g2qxZs2Lx4sXR2to67PgXXnghvvKVr8T+/fvj0ksvPaev2d/fH3V1ddHX1xe1tbXnPDsAUDqu32XyFvCxY8eio6Mjmpqahqw3NTXFzp07Rzzn+eefj7lz58b3v//9uOKKK+Lqq6+O++67L373u9+d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345ly5bF008/XeLJAQBKq6IoimKshzgf5s+fH3PmzIn169cPrs2aNSsWL14cra2tw47/1re+Fc8//3zs27dvcK25uTl++ctfxq5du87oa/b390ddXV309fVFbW3th38RAMCoc/2OqBzrAc6HY8eORUdHR6xcuXLIelNTU+zcuXPEc3bt2hVNTU1D1m688cbYsGFDvPvuuzFhwoRh5wwMDMTAwMDg876+voh4718kAOCj4dR1u0zugZ2TsgjA3t7eOHHiRNTX1w9Zr6+vj56enhHP6enpGfH448ePR29vb0yePHnYOa2trbFmzZph69OmTfsQ0wMAY+HIkSNRV1c31mOMibIIwFMqKiqGPC+KYtjaBx0/0vopq1atipaWlsHnb775ZkyfPj26urrS/gt0oejv749p06bFwYMH097Ov1DYiwuL/bhw2IsLR19fX1x55ZVx6aWXjvUoY6YsAnDSpEkxfvz4YXf7Dh8+POwu3ymXX375iMdXVlbGxIkTRzynuro6qqurh63X1dX5Zr5A1NbW2osLhL24sNiPC4e9uHCMG1c2vwt71srilVdVVUVDQ0O0t7cPWW9vb4/GxsYRz1mwYMGw47du3Rpz584d8ef/AADKRVkEYERES0tLPProo7Fx48bYt29frFixIrq6uqK5uTki3nv7dunSpYPHNzc3x6uvvhotLS2xb9++2LhxY2zYsCHuu+++sXoJAAAlURZvAUdELFmyJI4cORJr166N7u7umD17drS1tcX06dMjIqK7u3vIZwLOmDEj2traYsWKFfHwww/HlClT4qGHHoovf/nLZ/w1q6ur44EHHhjxbWFKy15cOOzFhcV+XDjsxYXDXpTR5wACAHBmyuYtYAAAzowABABIRgACACQjAAEAkhGAH2DdunUxY8aMqKmpiYaGhti+ffv7Hr9t27ZoaGiImpqamDlzZjzyyCMlmrT8nc1ePPPMM3HDDTfExz/+8aitrY0FCxbEL37xixJOW97O9vvilJdeeikqKyvjc5/73OgOmMjZ7sXAwECsXr06pk+fHtXV1fHJT34yNm7cWKJpy9/Z7semTZvimmuuiYsvvjgmT54cd911Vxw5cqRE05anF198MW655ZaYMmVKVFRUxHPPPfeB56S8dhec1j//8z8XEyZMKH72s58Ve/fuLe69997ikksuKV599dURj9+/f39x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' width=640.0/>\n",
       "            </div>\n",
       "        "
      ],
      "text/plain": [
       "Canvas(toolbar=Toolbar(toolitems=[('Home', 'Reset original view', 'home', 'home'), ('Back', 'Back to previous …"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig, ax = plt.subplots()\n",
    "ax.plot(data[:3600*24, 0])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.02051102806199375"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.std(data[:,0])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "2b835c8fb082428cabc1ad9112286728",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Canvas(toolbar=Toolbar(toolitems=[('Home', 'Reset original view', 'home', 'home'), ('Back', 'Back to previous …"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "(1e-06, 0.5)"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Number of samplepoints\n",
    "N = len(data[:,0])\n",
    "# sample spacing\n",
    "T = 1.0\n",
    "x = np.linspace(0.0, N*T, N)\n",
    "yf = scipy.fftpack.fft(data[:,0])\n",
    "xf = np.linspace(0.0, 1.0/(2.0*T), N//2)\n",
    "\n",
    "yf = 2.0/N * np.abs(yf[:N//2])\n",
    "\n",
    "#yf = sum(yf[s::10] for s in range(10)) / 10\n",
    "#xf = sum(xf[s::10] for s in range(10)) / 10\n",
    "\n",
    "fig, ax = plt.subplots()\n",
    "ax.loglog(xf, yf)\n",
    "ax.xaxis.set_major_formatter(plt.FuncFormatter(lambda x, _pos: f'{1/x:.1f}'))\n",
    "ax.set_xlabel('T in s')\n",
    "ax.set_ylabel('Amplitude Δf')\n",
    "ax.grid()\n",
    "ax.set_xlim([1/1000000, 0.5])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "94ca3cb49e7d452dab8f7e2e8d632b84",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Canvas(toolbar=Toolbar(toolitems=[('Home', 'Reset original view', 'home', 'home'), ('Back', 'Back to previous …"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "(5e-07, 0.02)"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Number of samplepoints\n",
    "N = len(data[:,0])\n",
    "# sample spacing\n",
    "T = 1.0\n",
    "x = np.linspace(0.0, N*T, N)\n",
    "yf = scipy.fftpack.fft(data[:,0])\n",
    "xf = np.linspace(0.0, 1.0/(2.0*T), N//2)\n",
    "\n",
    "yf = 2.0/N * np.abs(yf[:N//2])\n",
    "\n",
    "average_from = lambda val, start, average_width: np.hstack([val[:start], [ np.mean(val[i:i+average_width]) for i in range(start, len(val), average_width) ]])\n",
    "\n",
    "average_width = 20\n",
    "average_start = 100\n",
    "yf = average_from(yf, average_start, average_width)\n",
    "xf = average_from(xf, average_start, average_width)\n",
    "yf = average_from(yf, 300, average_width)\n",
    "xf = average_from(xf, 300, average_width)\n",
    "\n",
    "fig, ax = plt.subplots()\n",
    "ax.loglog(xf, yf)\n",
    "ax.xaxis.set_major_formatter(plt.FuncFormatter(lambda x, _pos: f'{1/x:.1f}'))\n",
    "ax.set_xlabel('T in s')\n",
    "ax.set_ylabel('Amplitude Δf')\n",
    "\n",
    "for i, t in enumerate([45, 60, 600, 1200, 1800, 3600]):\n",
    "    ax.axvline(1/t, color='red', alpha=0.5)\n",
    "    ax.annotate(f'{t} s', xy=(1/t, 3e-3), xytext=(-15, 0), xycoords='data', textcoords='offset pixels', rotation=90)\n",
    "#ax.text(1/60, 10,'60 s', ha='left')\n",
    "ax.grid()\n",
    "ax.set_xlim([1/60000, 0.5])\n",
    "ax.set_ylim([5e-7, 2e-2])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "91a04300b9164bd7a9915d0028f3e563",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Canvas(toolbar=Toolbar(toolitems=[('Home', 'Reset original view', 'home', 'home'), ('Back', 'Back to previous …"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "ys = scipy.fftpack.fft(data[:,0])\n",
    "ys = 2.0/len(data) * np.abs(ys[:len(data)//2])\n",
    "s = 60\n",
    "\n",
    "ys = np.convolve(ys, np.ones((s,))/s, mode='valid')\n",
    "\n",
    "xs = np.linspace(0, 1.0/2.0, len(data)//2)\n",
    "#xs = np.linspace(len(data)/2, 1, len(data)/2)\n",
    "\n",
    "fig, ax = plt.subplots()\n",
    "ax.loglog(xs[s//2:-s//2+1], ys)\n",
    "ax.xaxis.set_major_formatter(plt.FuncFormatter(lambda x, _pos: 1/x))\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "2811a79d4ad8487f822750e4419ccfdb",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Canvas(toolbar=Toolbar(toolitems=[('Home', 'Reset original view', 'home', 'home'), ('Back', 'Back to previous …"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "ys = scipy.fftpack.fft(data[:,0])\n",
    "ys = 2.0/len(data) * np.abs(ys[:len(data)//2])\n",
    "s = 1\n",
    "\n",
    "ys = np.convolve(ys, np.ones((s,))/s, mode='valid')\n",
    "\n",
    "xs = np.linspace(0, 1.0/2.0, len(data)//2)\n",
    "#xs = np.linspace(len(data)/2, 1, len(data)/2)\n",
    "\n",
    "fig, ax = plt.subplots()\n",
    "ax.loglog(xs[s//2:-s//2+1 if s > 1 else None], ys)\n",
    "ax.xaxis.set_major_formatter(plt.FuncFormatter(lambda x, _pos: 1/x))\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "c678197e011e4ab4982d3e1d2a2cee9a",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Canvas(toolbar=Toolbar(toolitems=[('Home', 'Reset original view', 'home', 'home'), ('Back', 'Back to previous …"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "ys = scipy.fftpack.fft(data[:,0])\n",
    "ys = 2.0/len(data) * np.abs(ys[:len(data)//2])\n",
    "s = 1\n",
    "\n",
    "ys = np.convolve(ys, np.ones((s,))/s, mode='valid')\n",
    "\n",
    "xs = np.linspace(0, 1.0/2.0, len(data)//2)\n",
    "\n",
    "ys *= 2*np.pi*xs\n",
    "#xs = np.linspace(len(data)/2, 1, len(data)/2)\n",
    "\n",
    "fig, ax = plt.subplots()\n",
    "ax.loglog(xs[s//2:-s//2+1 if s > 1 else None], ys)\n",
    "ax.xaxis.set_major_formatter(plt.FuncFormatter(lambda x, _pos: 1/x))\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "52bcd29a41a54ed1bf9dc63e0c9e83d8",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Canvas(toolbar=Toolbar(toolitems=[('Home', 'Reset original view', 'home', 'home'), ('Back', 'Back to previous …"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "ys = scipy.fftpack.fft(data[:,0])\n",
    "ys = 2.0/len(data) * np.abs(ys[:len(data)//2])\n",
    "s = 30\n",
    "\n",
    "ys = np.convolve(ys, np.ones((s,))/s, mode='valid')\n",
    "\n",
    "xs = np.linspace(0, 1.0/2.0, len(data)//2)\n",
    "\n",
    "ys *= 2*np.pi*xs[s//2:-s//2+1]\n",
    "\n",
    "#xs = np.linspace(len(data)/2, 1, len(data)/2)\n",
    "\n",
    "fig, ax = plt.subplots(figsize=(9,5))\n",
    "ax.loglog(xs[s//2:-s//2+1], ys)\n",
    "ax.xaxis.set_major_formatter(plt.FuncFormatter(lambda x, _pos: 1/x))\n",
    "ax.grid()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "15.923566878980893"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "1/0.0628"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "jupytersucks-dsss",
   "language": "python",
   "name": "jupytersucks-dsss"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}