m17-cxx-demod/filter-taps.ipynb

424 wiersze
65 KiB
Plaintext

{
"cells": [
{
"cell_type": "code",
2022-03-15 00:18:35 +00:00
"execution_count": 2,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Populating the interactive namespace from numpy and matplotlib\n"
]
},
{
"data": {
2022-03-15 00:18:35 +00:00
"image/png": "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
"text/plain": [
2022-03-15 00:18:35 +00:00
"<Figure size 1200x400 with 1 Axes>"
]
},
2022-03-15 00:18:35 +00:00
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"%pylab inline\n",
"from commpy.filters import rrcosfilter\n",
"\n",
"sample_rate = 48000\n",
"samples_per_symbol = 10\n",
"\n",
"def response_plot(taps, sample_rate, legend):\n",
"\n",
" duration = len(taps) / sample_rate\n",
" t = np.linspace(0, duration, len(taps), endpoint=True)\n",
" plt.figure()\n",
" plt.rcParams['figure.figsize'] = [12, 4]\n",
" ax = plt.subplot(1, 1, 1)\n",
" plt.xlabel('Time (msec)')\n",
" plt.locator_params(axis='y', nbins=8)\n",
" plt.grid()\n",
" plt.xticks(np.arange(0, duration, 1.0/4800.0), rotation=45)\n",
" plt.plot(t, taps)\n",
" plt.legend(legend)\n",
"\n",
2022-03-15 00:18:35 +00:00
"taps = rrcosfilter(int(40 * 8), 0.5, 1.0, 40.0)[1][1:]\n",
"response_plot(taps, sample_rate, [\"Erroneous Filter Resoponse\"])"
]
},
{
"cell_type": "code",
2022-03-15 00:18:35 +00:00
"execution_count": 11,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
2022-03-15 00:18:35 +00:00
"40.07977085248521\n",
"1.1366197723675815\n",
"28828.0\n",
"-292,\n",
"-288,\n",
"-280,\n",
"-268,\n",
"-251,\n",
"-230,\n",
"-206,\n",
"-177,\n",
"-146,\n",
"-111,\n",
"-73,\n",
"-33,\n",
"9,\n",
"52,\n",
"96,\n",
"141,\n",
"185,\n",
"228,\n",
"269,\n",
"308,\n",
"345,\n",
"379,\n",
"408,\n",
"434,\n",
"454,\n",
"470,\n",
"479,\n",
"484,\n",
"482,\n",
"474,\n",
"460,\n",
"439,\n",
"413,\n",
"381,\n",
"343,\n",
"300,\n",
"252,\n",
"201,\n",
"145,\n",
"87,\n",
"26,\n",
"-35,\n",
"-98,\n",
"-160,\n",
"-221,\n",
"-280,\n",
"-335,\n",
"-387,\n",
"-434,\n",
"-475,\n",
"-509,\n",
"-537,\n",
"-556,\n",
"-567,\n",
"-569,\n",
"-561,\n",
"-544,\n",
"-517,\n",
"-480,\n",
"-433,\n",
"-377,\n",
"-312,\n",
"-238,\n",
"-156,\n",
"-67,\n",
"28,\n",
"128,\n",
"232,\n",
"338,\n",
"445,\n",
"552,\n",
"657,\n",
"758,\n",
"854,\n",
"943,\n",
"1023,\n",
"1093,\n",
"1150,\n",
"1194,\n",
"1223,\n",
"1235,\n",
"1229,\n",
"1205,\n",
"1160,\n",
"1095,\n",
"1008,\n",
"900,\n",
"770,\n",
"618,\n",
"445,\n",
"252,\n",
"39,\n",
"-192,\n",
"-440,\n",
"-703,\n",
"-979,\n",
"-1266,\n",
"-1561,\n",
"-1861,\n",
"-2163,\n",
"-2465,\n",
"-2762,\n",
"-3051,\n",
"-3328,\n",
"-3589,\n",
"-3831,\n",
"-4049,\n",
"-4239,\n",
"-4398,\n",
"-4522,\n",
"-4606,\n",
"-4648,\n",
"-4642,\n",
"-4587,\n",
"-4480,\n",
"-4316,\n",
"-4094,\n",
"-3812,\n",
"-3467,\n",
"-3059,\n",
"-2587,\n",
"-2048,\n",
"-1445,\n",
"-777,\n",
"-44,\n",
"752,\n",
"1609,\n",
"2524,\n",
"3496,\n",
"4521,\n",
"5595,\n",
"6715,\n",
"7875,\n",
"9071,\n",
"10297,\n",
"11548,\n",
"12818,\n",
"14102,\n",
"15391,\n",
"16681,\n",
"17963,\n",
"19232,\n",
"20481,\n",
"21702,\n",
"22890,\n",
"24037,\n",
"25137,\n",
"26183,\n",
"27171,\n",
"28093,\n",
"28944,\n",
"29721,\n",
"30417,\n",
"31029,\n",
"31553,\n",
"31986,\n",
"32326,\n",
"32570,\n",
"32717,\n",
"32766,\n",
"32717,\n",
"32570,\n",
"32326,\n",
"31986,\n",
"31553,\n",
"31029,\n",
"30417,\n",
"29721,\n",
"28944,\n",
"28093,\n",
"27171,\n",
"26183,\n",
"25137,\n",
"24037,\n",
"22890,\n",
"21702,\n",
"20481,\n",
"19232,\n",
"17963,\n",
"16681,\n",
"15391,\n",
"14102,\n",
"12818,\n",
"11548,\n",
"10297,\n",
"9071,\n",
"7875,\n",
"6715,\n",
"5595,\n",
"4521,\n",
"3496,\n",
"2524,\n",
"1609,\n",
"752,\n",
"-44,\n",
"-777,\n",
"-1445,\n",
"-2048,\n",
"-2587,\n",
"-3059,\n",
"-3467,\n",
"-3812,\n",
"-4094,\n",
"-4316,\n",
"-4480,\n",
"-4587,\n",
"-4642,\n",
"-4648,\n",
"-4606,\n",
"-4522,\n",
"-4398,\n",
"-4239,\n",
"-4049,\n",
"-3831,\n",
"-3589,\n",
"-3328,\n",
"-3051,\n",
"-2762,\n",
"-2465,\n",
"-2163,\n",
"-1861,\n",
"-1561,\n",
"-1266,\n",
"-979,\n",
"-703,\n",
"-440,\n",
"-192,\n",
"39,\n",
"252,\n",
"445,\n",
"618,\n",
"770,\n",
"900,\n",
"1008,\n",
"1095,\n",
"1160,\n",
"1205,\n",
"1229,\n",
"1235,\n",
"1223,\n",
"1194,\n",
"1150,\n",
"1093,\n",
"1023,\n",
"943,\n",
"854,\n",
"758,\n",
"657,\n",
"552,\n",
"445,\n",
"338,\n",
"232,\n",
"128,\n",
"28,\n",
"-67,\n",
"-156,\n",
"-238,\n",
"-312,\n",
"-377,\n",
"-433,\n",
"-480,\n",
"-517,\n",
"-544,\n",
"-561,\n",
"-569,\n",
"-567,\n",
"-556,\n",
"-537,\n",
"-509,\n",
"-475,\n",
"-434,\n",
"-387,\n",
"-335,\n",
"-280,\n",
"-221,\n",
"-160,\n",
"-98,\n",
"-35,\n",
"26,\n",
"87,\n",
"145,\n",
"201,\n",
"252,\n",
"300,\n",
"343,\n",
"381,\n",
"413,\n",
"439,\n",
"460,\n",
"474,\n",
"482,\n",
"484,\n",
"479,\n",
"470,\n",
"454,\n",
"434,\n",
"408,\n",
"379,\n",
"345,\n",
"308,\n",
"269,\n",
"228,\n",
"185,\n",
"141,\n",
"96,\n",
"52,\n",
"9,\n",
"-33,\n",
"-73,\n",
"-111,\n",
"-146,\n",
"-177,\n",
"-206,\n",
"-230,\n",
"-251,\n",
"-268,\n",
"-280,\n",
"-288,\n",
"-292\n"
]
}
],
"source": [
2022-03-15 00:18:35 +00:00
"gain = sum(taps)\n",
"print(gain)\n",
"print(max(taps))\n",
"print(32767 // max(taps))\n",
"\n",
"print(\",\\n\".join([str(int(t * 32767 // max(taps))) for t in taps]))"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"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",
2022-03-15 00:18:35 +00:00
"version": "3.10.1"
}
},
"nbformat": 4,
"nbformat_minor": 4
}