Skip to content

Instantly share code, notes, and snippets.

@bmcfee
Created June 27, 2022 17:36
Show Gist options
  • Save bmcfee/4aa4c959bb0d310e3f12cdedf91d7661 to your computer and use it in GitHub Desktop.
Save bmcfee/4aa4c959bb0d310e3f12cdedf91d7661 to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"Vendor: Continuum Analytics, Inc.\n",
"Package: mkl\n",
"Message: trial mode expires in 30 days\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Not running from main.\n",
"Not running from main.\n"
]
}
],
"source": [
"import numpy as np\n",
"import scipy.signal\n",
"import simple_spearmint\n",
"import matplotlib.pyplot as plt\n",
"%matplotlib inline"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"import resampy"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"import functools"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"resampy.filters.sinc_window()"
]
},
{
"cell_type": "code",
"execution_count": 64,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"# Parameter space for kaiser window\n",
"parameter_space = {'beta': {'type': 'float', 'min': 0, 'max': 20},\n",
" 'rolloff': {'type': 'float', 'min': 0.85, 'max': 0.99}}"
]
},
{
"cell_type": "code",
"execution_count": 104,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"NUM_ZEROS = 32\n",
"\n",
"def get_window(beta=None, rolloff=None):\n",
" \n",
" win = functools.partial(scipy.signal.kaiser, beta=beta)\n",
" fil = resampy.filters.sinc_window(num_zeros=NUM_ZEROS,\n",
" precision=1,\n",
" window=win,\n",
" rolloff=rolloff)[0]\n",
" \n",
" # The windowed filter\n",
" fil = np.concatenate([fil[-1:0:-1], fil])\n",
" \n",
" return fil\n",
"\n",
"\n",
"def objective(beta, rolloff, pow_pass=1.0, pow_stop=1e-10, weight=None):\n",
" \n",
" if weight is None:\n",
" weight = np.ones(2)\n",
" \n",
" fil = get_window(beta, rolloff)\n",
" \n",
" W, H = scipy.signal.freqz(fil)\n",
" \n",
" H = np.abs(H)**2\n",
" H_pass = H[W <= 0.5 * np.pi]\n",
" H_stop = H[W >= 0.5 * np.pi]\n",
" \n",
" err_pass = np.max(weight[0] * np.abs(np.log10(H_pass) - np.log10(pow_pass)))\n",
" err_stop = np.max(weight[1] * np.abs(np.log10(np.maximum(pow_stop, H_stop)) - np.log10(pow_stop)))\n",
" \n",
" return max(err_pass, err_stop)"
]
},
{
"cell_type": "code",
"execution_count": 105,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"# Create the optimizer\n",
"ss = simple_spearmint.SimpleSpearmint(parameter_space)"
]
},
{
"cell_type": "code",
"execution_count": 106,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"GP trial 0: {'beta': 0.0, 'rolloff': 0.85} -> 11.2325208042\n",
"GP trial 1: {'beta': 10.0, 'rolloff': 0.9199999999999999} -> 5.39913139597\n",
"GP trial 2: {'beta': 20.0, 'rolloff': 0.99} -> 9.83101428606\n",
"GP trial 3: {'beta': 4.037162229731229, 'rolloff': 0.9715786871279306} -> 8.29060859081\n",
"GP trial 4: {'beta': 14.67591404728825, 'rolloff': 0.8707041795951609} -> 8.12193984885\n",
"GP trial 5: {'beta': 19.994111805039132, 'rolloff': 0.85} -> 7.26227321417\n",
"GP trial 6: {'beta': 6.339778221443366, 'rolloff': 0.85} -> 9.56672237901\n",
"GP trial 7: {'beta': 20.0, 'rolloff': 0.9728579371883465} -> 9.47027212098\n",
"GP trial 8: {'beta': 9.177564570676513, 'rolloff': 0.99} -> 9.74225258319\n",
"GP trial 9: {'beta': 10.799653021878608, 'rolloff': 0.9322443527191048} -> 6.9517479471\n",
"GP trial 10: {'beta': 20.0, 'rolloff': 0.904414562341393} -> 6.88092168306\n",
"GP trial 11: {'beta': 0.0, 'rolloff': 0.9159519282055442} -> 7.69854718934\n",
"GP trial 12: {'beta': 20.0, 'rolloff': 0.8500119445900457} -> 7.25824257568\n",
"GP trial 13: {'beta': 20.0, 'rolloff': 0.9170851953829868} -> 7.52767587339\n",
"GP trial 14: {'beta': 0.0, 'rolloff': 0.9440690082545639} -> 8.00492129976\n",
"GP trial 15: {'beta': 12.743990261742713, 'rolloff': 0.9101229525435829} -> 5.6537754859\n",
"GP trial 16: {'beta': 9.563611277367848, 'rolloff': 0.9047216585777837} -> 8.98659025034\n",
"GP trial 17: {'beta': 20.0, 'rolloff': 0.882327156183796} -> 5.51143529724\n",
"GP trial 18: {'beta': 20.0, 'rolloff': 0.8918203034223987} -> 6.14160454516\n",
"GP trial 19: {'beta': 20.0, 'rolloff': 0.8865448732165685} -> 5.79976280813\n",
"GP trial 20: {'beta': 20.0, 'rolloff': 0.9899950643908126} -> 9.83092367656\n",
"GP trial 21: {'beta': 0.0, 'rolloff': 0.99} -> 9.17425473343\n",
"GP trial 22: {'beta': 20.0, 'rolloff': 0.856208129585175} -> 6.63446068628\n",
"GP trial 23: {'beta': 20.0, 'rolloff': 0.9328588556121393} -> 8.21451015216\n",
"GP trial 24: {'beta': 17.867568071485326, 'rolloff': 0.9182835288776497} -> 7.34589736327\n",
"GP trial 25: {'beta': 20.0, 'rolloff': 0.8826619329370853} -> 5.5348300121\n",
"GP trial 26: {'beta': 20.0, 'rolloff': 0.8753588260092019} -> 5.0034026823\n",
"GP trial 27: {'beta': 20.0, 'rolloff': 0.871786988421234} -> 5.27352170638\n",
"GP trial 28: {'beta': 20.0, 'rolloff': 0.8699264965433244} -> 5.42251355364\n",
"GP trial 29: {'beta': 20.0, 'rolloff': 0.8692444224224586} -> 5.47797970802\n",
"GP trial 30: {'beta': 19.507971898899914, 'rolloff': 0.8833845158710278} -> 5.4730535934\n",
"GP trial 31: {'beta': 6.916698779208557, 'rolloff': 0.9261693083052893} -> 7.61533914846\n",
"GP trial 32: {'beta': 14.489489945136977, 'rolloff': 0.9021537223835162} -> 5.55446165182\n",
"GP trial 33: {'beta': 13.690171350822066, 'rolloff': 0.9225252057975502} -> 6.92510717746\n",
"GP trial 34: {'beta': 11.49367668457377, 'rolloff': 0.85} -> 14.0291034907\n",
"GP trial 35: {'beta': 12.420930376497504, 'rolloff': 0.99} -> 9.78147149143\n",
"GP trial 36: {'beta': 10.178696984314312, 'rolloff': 0.9639331457032212} -> 8.81001362591\n",
"GP trial 37: {'beta': 11.678179582387722, 'rolloff': 0.9010902466895738} -> 5.99835514555\n",
"GP trial 38: {'beta': 3.0795596009510664, 'rolloff': 0.85} -> 5.85717902949\n",
"GP trial 39: {'beta': 2.329814286676089, 'rolloff': 0.8999411082582142} -> 6.54351615863\n",
"GP trial 40: {'beta': 0.9910033670022349, 'rolloff': 0.8727452381432501} -> 7.127192488\n",
"GP trial 41: {'beta': 1.235430150361015, 'rolloff': 0.9333788929600298} -> 7.57527505856\n",
"GP trial 42: {'beta': 3.57669789050203, 'rolloff': 0.871991548319911} -> 7.23591240857\n",
"GP trial 43: {'beta': 15.799069500733115, 'rolloff': 0.8871157143619645} -> 5.34811855095\n",
"GP trial 44: {'beta': 17.821703235588295, 'rolloff': 0.8776660474627218} -> 5.46657560497\n",
"GP trial 45: {'beta': 0.20840436455461497, 'rolloff': 0.9225784176426787} -> 7.63116352942\n",
"GP trial 46: {'beta': 0.24043750006647568, 'rolloff': 0.85} -> 7.27302158779\n",
"GP trial 47: {'beta': 1.3002804099328846, 'rolloff': 0.85} -> 6.9454713277\n",
"GP trial 48: {'beta': 0.7624411130589498, 'rolloff': 0.8984749351757574} -> 7.18231688454\n",
"GP trial 49: {'beta': 3.5484733350050317, 'rolloff': 0.9190554926987773} -> 5.76740546622\n",
"GP trial 50: {'beta': 2.6751479966595353, 'rolloff': 0.9329048192849758} -> 7.50502628251\n",
"GP trial 51: {'beta': 0.5893005614717396, 'rolloff': 0.99} -> 9.21060994727\n",
"GP trial 52: {'beta': 0.14431803937205148, 'rolloff': 0.8825701729938507} -> 7.47116705509\n",
"GP trial 53: {'beta': 4.168621203950505, 'rolloff': 0.85} -> 8.71028075093\n",
"GP trial 54: {'beta': 2.349117067431427, 'rolloff': 0.862342333019035} -> 6.18382521636\n",
"GP trial 55: {'beta': 4.673308519129128, 'rolloff': 0.9117926023399903} -> 6.58536549149\n",
"GP trial 56: {'beta': 3.327984846534191, 'rolloff': 0.9007387272472233} -> 5.90380321528\n",
"GP trial 57: {'beta': 13.807933160053175, 'rolloff': 0.8939255400838508} -> 5.54666421389\n",
"GP trial 58: {'beta': 4.748603906404789, 'rolloff': 0.9346048289010527} -> 6.63128300171\n",
"GP trial 59: {'beta': 2.3630038475197015, 'rolloff': 0.85} -> 6.73582577185\n",
"GP trial 60: {'beta': 0.667944096507408, 'rolloff': 0.85} -> 7.18802989273\n",
"GP trial 61: {'beta': 2.642708408159284, 'rolloff': 0.8805094476338527} -> 6.3064924049\n",
"GP trial 62: {'beta': 9.151559551820217, 'rolloff': 0.9301962401933631} -> 6.14053807864\n",
"GP trial 63: {'beta': 1.85564229857546, 'rolloff': 0.99} -> 9.39515829225\n",
"GP trial 64: {'beta': 1.637348221773539, 'rolloff': 0.8854446926488625} -> 6.94170003014\n",
"GP trial 65: {'beta': 5.912153946035048, 'rolloff': 0.99} -> 9.67152214549\n",
"GP trial 66: {'beta': 16.51008370727116, 'rolloff': 0.8919027789929939} -> 5.32757580351\n",
"GP trial 67: {'beta': 1.0564896127585004, 'rolloff': 0.8551182141265653} -> 7.05362508674\n",
"GP trial 68: {'beta': 18.41873910520212, 'rolloff': 0.8859513445918847} -> 5.39305865692\n",
"GP trial 69: {'beta': 11.138647004180983, 'rolloff': 0.9146575051641828} -> 5.40636120448\n",
"GP trial 70: {'beta': 1.4993725813922962, 'rolloff': 0.9100276358124288} -> 7.23256149274\n",
"GP trial 71: {'beta': 15.295924829330492, 'rolloff': 0.8939510771612941} -> 5.10167489263\n",
"GP trial 72: {'beta': 0.4262331351204157, 'rolloff': 0.87729072470668} -> 7.37550878937\n",
"GP trial 73: {'beta': 0.6560507981324035, 'rolloff': 0.923652014804523} -> 7.53172200084\n",
"GP trial 74: {'beta': 15.401971919953168, 'rolloff': 0.8942169015674284} -> 5.16379797367\n",
"GP trial 75: {'beta': 3.000716596568838, 'rolloff': 0.911193819075241} -> 6.25016930774\n",
"GP trial 76: {'beta': 3.8628933793494955, 'rolloff': 0.9097082403499169} -> 5.99631480195\n",
"GP trial 77: {'beta': 2.9478263552537505, 'rolloff': 0.861918696948962} -> 7.1702948316\n",
"GP trial 78: {'beta': 0.0, 'rolloff': 0.8707560505826405} -> 7.2236610008\n",
"GP trial 79: {'beta': 0.21969695175498585, 'rolloff': 0.8604518414196398} -> 7.19907993355\n",
"GP trial 80: {'beta': 1.7542951436295189, 'rolloff': 0.8666786646914417} -> 8.70658898333\n",
"GP trial 81: {'beta': 0.0, 'rolloff': 0.8885764673027042} -> 7.44916414852\n",
"GP trial 82: {'beta': 15.221840708339332, 'rolloff': 0.8951592083183822} -> 5.18487668695\n",
"GP trial 83: {'beta': 17.098685057686435, 'rolloff': 0.8892933658863394} -> 5.29009636291\n",
"GP trial 84: {'beta': 19.634495060994205, 'rolloff': 0.873202634813033} -> 5.26580177131\n",
"GP trial 85: {'beta': 17.087956365568253, 'rolloff': 0.889622438156782} -> 5.31361536567\n",
"GP trial 86: {'beta': 0.04590728796259923, 'rolloff': 0.99} -> 9.1744926326\n",
"GP trial 87: {'beta': 5.876847899174255, 'rolloff': 0.893067759149822} -> 9.43568077592\n",
"GP trial 88: {'beta': 2.366656821198731, 'rolloff': 0.8548313971985493} -> 6.70930828769\n",
"GP trial 89: {'beta': 0.02298099018885543, 'rolloff': 0.8729903379601206} -> 7.3330342591\n",
"GP trial 90: {'beta': 4.196619551726449, 'rolloff': 0.8871034025568728} -> 6.61628725786\n",
"GP trial 91: {'beta': 2.9920089554687825, 'rolloff': 0.99} -> 9.52101033845\n",
"GP trial 92: {'beta': 0.38995680510667075, 'rolloff': 0.8523097864530265} -> 7.277585475\n",
"GP trial 93: {'beta': 3.2912671692494593, 'rolloff': 0.8867746050105568} -> 7.35025913342\n",
"GP trial 94: {'beta': 5.001437383912855, 'rolloff': 0.868371082765533} -> 7.40602230707\n",
"GP trial 95: {'beta': 8.17715625087332, 'rolloff': 0.85} -> 9.77709399719\n",
"GP trial 96: {'beta': 2.2151008787052415, 'rolloff': 0.8810549301891102} -> 6.59920114758\n",
"GP trial 97: {'beta': 5.723939256417172, 'rolloff': 0.931444783201279} -> 5.98630923668\n",
"GP trial 98: {'beta': 5.591877164541059, 'rolloff': 0.9178842350867656} -> 7.66325213399\n",
"GP trial 99: {'beta': 6.289886550015541, 'rolloff': 0.9486396698765361} -> 6.74581249954\n"
]
}
],
"source": [
"for n in range(100):\n",
" p = ss.suggest()\n",
" v = objective(**p)\n",
" print('GP trial {}: {} -> {}'.format(n, p, v))\n",
" ss.update(p, v)"
]
},
{
"cell_type": "code",
"execution_count": 84,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"({'beta': 8.555504641634386, 'rolloff': 0.85}, 5.0018097318630508)"
]
},
"execution_count": 84,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"#NZ = 16\n",
"# ({'beta': 8.555504641634386, 'rolloff': 0.85}, 5.0018097318630508)\n",
"#ss.get_best_parameters()"
]
},
{
"cell_type": "code",
"execution_count": 112,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"({'beta': 20.0, 'rolloff': 0.8753588260092019}, 5.0034026823046949)"
]
},
"execution_count": 112,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# NZ=32\n",
"# \n",
"ss.get_best_parameters()"
]
},
{
"cell_type": "code",
"execution_count": 93,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"({'beta': 14.769656459379492, 'rolloff': 0.9475937167399596},\n",
" 5.0183678731740322)"
]
},
"execution_count": 93,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# NZ=64\n",
"# ({'beta': 14.769656459379492, 'rolloff': 0.9475937167399596}, 5.0183678731740322)\n",
"#ss.get_best_parameters()"
]
},
{
"cell_type": "code",
"execution_count": 113,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"win = get_window(**ss.get_best_parameters()[0])"
]
},
{
"cell_type": "code",
"execution_count": 114,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"W, H = scipy.signal.freqz(win)"
]
},
{
"cell_type": "code",
"execution_count": 115,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"win_default = get_window(scipy.signal.kaiser_beta(160), 0.945)\n",
"W2, H2 = scipy.signal.freqz(win_default)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"np.load"
]
},
{
"cell_type": "code",
"execution_count": 116,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"image/png": "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\nAfwfMu3FbzbW8KoAAAAASUVORK5CYII=\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x7fd455dc7450>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plt.semilogy(W, np.abs(H)**2, label='opt')\n",
"plt.semilogy(W2, np.abs(H2)**2, label='heuristic')\n",
"plt.axvline(np.pi * 0.5)\n",
"plt.legend()\n",
"plt.grid()"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 2",
"language": "python",
"name": "python2"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 2
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython2",
"version": "2.7.11"
}
},
"nbformat": 4,
"nbformat_minor": 0
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment