test-stl/psd.ipynb

287 lines
187 KiB
Plaintext
Raw Permalink Normal View History

2023-08-23 17:37:40 +03:00
{
"cells": [
{
"cell_type": "code",
"execution_count": 36,
"id": "69c36f23-9417-461a-b1b4-cbe82e32d352",
"metadata": {
"tags": []
},
"outputs": [],
"source": [
"import numpy as np\n",
"\n",
"fs = 1000 # 1 kHz sampling frequency\n",
"F1 = 10 # First signal component at 10 Hz\n",
"F2 = 60 # Second signal component at 60 Hz\n",
"T = 10 # 10s signal length\n",
"N0 = -10 # Noise level (dB)\n",
"\n",
"N1 = -20 # First Peak level (dB)\n",
"\n",
"t = np.r_[0:T:(1/fs)] # Sample times\n",
"\n",
"# Two Sine signal components at frequencies F1 and F2.\n",
"signal = np.sin(2 * F1 * np.pi * t)* 10**(N1/20.0) + np.sin(2 * F2 * np.pi * t) \n",
"\n",
"# White noise with power N0\n",
"signal += np.random.randn(len(signal)) * 10**(N0/20.0) "
]
},
{
"cell_type": "code",
"execution_count": 37,
"id": "597a924d-ed00-4b2f-816c-fe7c411aeac9",
"metadata": {
"tags": []
},
"outputs": [
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import matplotlib.pyplot as plt\n",
"\n",
"psd_values, frequencies = plt.psd(signal, NFFT=1024, Fs=fs)"
]
},
{
"cell_type": "code",
"execution_count": 38,
"id": "5f8c8ec6-cad6-4e82-8808-7b540e4f2fcf",
"metadata": {
"tags": []
},
"outputs": [],
"source": [
"import scipy.signal\n",
"\n",
"# f contains the frequency components\n",
"# S is the PSD\n",
"(f, S) = scipy.signal.periodogram(signal, fs, scaling='density')"
]
},
{
"cell_type": "code",
"execution_count": 39,
"id": "b2be5aba-430d-4edb-be33-8329535f111a",
"metadata": {
"tags": []
},
"outputs": [
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import matplotlib.pyplot as plt\n",
"import math\n",
"\n",
"plt.semilogy(f, S)\n",
"plt.ylim([1e-7, 1e2])\n",
"plt.xlim([0,100])\n",
"plt.xlabel('frequency [Hz]')\n",
"plt.ylabel('PSD [V**2/Hz]')\n",
"\n",
"tr = 0.01\n",
"\n",
"peaks, properties = scipy.signal.find_peaks(S, threshold=tr)\n",
"plt.plot([p//10 for p in peaks], S[peaks], \"o\")\n",
"\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"id": "b15c8032-549d-49d4-abd5-594f42f8fda5",
"metadata": {},
"source": [
"## Welch's method PSD estimation (get peaks only for 0-20)"
]
},
{
"cell_type": "code",
"execution_count": 40,
"id": "ce233ae5-1ab4-47fd-97c7-288d4de314cc",
"metadata": {
"tags": []
},
"outputs": [
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"[61]\n"
]
}
],
"source": [
"(f1, S1)= scipy.signal.welch(signal, fs, nperseg=1024)\n",
"\n",
"plt.semilogy(f1, S1)\n",
"plt.xlim([0, 100])\n",
"plt.xlabel('frequency [Hz]')\n",
"plt.ylabel('PSD [V**2/Hz]')\n",
"\n",
"peaks1, properties1 = scipy.signal.find_peaks(S1, threshold=tr)\n",
"plt.plot(peaks1, S1[peaks1], \"o\")\n",
"\n",
"plt.show()\n",
"\n",
"\n",
"print(peaks1)\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": 41,
"id": "616744d1-2882-440c-88cf-170f54f7401f",
"metadata": {
"tags": []
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"-10dB в попугай: 0.0031622776601683794\n",
"попгуай в dB -20.0\n"
]
}
],
"source": [
"tr = 0.01 # Попугай\n",
"\n",
"trdb = 10*math.log10(tr)\n",
"\n",
"\n",
"DB = -25\n",
"\n",
"tr = 10**(DB/10)\n",
"\n",
"print(\"-10dB в попугай: \", tr)\n",
"print(\"попгуай в dB\", trdb)\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": 42,
"id": "591c1b9b-a99d-4167-aef8-caf1fb624204",
"metadata": {
"tags": []
},
"outputs": [
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"[10, 60] [-13.144250848181834, 6.998171028855628]\n"
]
}
],
"source": [
"(f, S) = scipy.signal.periodogram(signal, fs, scaling='density')\n",
"\n",
"plt.semilogy(f, S)\n",
"plt.ylim([1e-7, 1e2])\n",
"plt.xlim([0,100])\n",
"plt.xlabel('frequency [Hz]')\n",
"plt.ylabel('PSD [V**2/Hz]')\n",
"\n",
"peakFreq = [p//10 for p in peaks]\n",
"freqPow = [10*math.log10(z) for z in S[peaks]]\n",
"\n",
"# tr = 0.00316 == -10dB\n",
"peaks, properties = scipy.signal.find_peaks(S, threshold=tr)\n",
"plt.plot(peakFreq, S[peaks], \"o\")\n",
"\n",
"plt.show()\n",
"\n",
"print(peakFreq, freqPow)"
]
},
{
"cell_type": "code",
"execution_count": 43,
"id": "a03ad31a-4bdc-4c3f-a44f-734a84fd4b39",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"815 MHz is active! 6.998171028855628 dB\n"
]
}
],
"source": [
"if 60 in peakFreq:\n",
" pw = freqPow[peakFreq.index(60)]\n",
" print('815 MHz is active! ', pw, 'dB')\n",
" \n",
" \n",
" \n",
" "
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"language": "python",
"name": "python3"
},
"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.9.7"
}
},
"nbformat": 4,
"nbformat_minor": 5
}