m8ta
You are not authenticated, login. |
|
{1574} |
ref: -0
tags: ocaml application functional programming
date: 10-11-2022 21:36 gmt
revision:2
[1] [0] [head]
|
||||
https://stackoverflow.com/questions/26475765/ocaml-function-with-variable-number-of-arguments From this I learned that in ocaml you can return not just functions (e.g. currying) but appliations of yet-to-be named functions. let sum f = f 0 ;; let arg a b c = c ( b + a ) ;; let z a = a ;; then sum (arg 1) ;; is well-typed as (int -> `a) -> `a = <fun> e.g. an application of a function that converts int to `a. Think of it as the application of Xa to argument ( 0 + 1 ), where Xa is the argument (per type signature). Zero is supplied by the definition of 'sum'. sum (arg 1) (arg 2);; can be parsed as (sum (arg 1)) (arg 2) ;; '(arg 2)' outputs an application of an int & a yet-to be determined function to 'a, E.g. it's typed as int -> (int -> `a) -> `a = <fun>. So, you can call it Xa passed to above. Or, Xa = Xb( ( 0 + 1 ) + 2) where, again, Xb is a yet-to-be defined function that is supplied as an argument. Therefore, you can collapse the whole chain with the identity function z. But, of course, it could be anything else -- square root perhaps for MSE? All very clever. | |||||
{1570} | |||||
Kickback cuts Backprop's red-tape: Biologically plausible credit assignment in neural networks Bit of a meh -- idea is, rather than propagating error signals backwards through a hierarchy, you propagate only one layer + use a signed global reward signal. This works by keeping the network ‘coherent’ -- positive neurons have positive input weights, and negative neurons have negative weights, such that the overall effect of a weight change does not change sign when propagated forward through the network. This is kind of a lame shortcut, imho, as it limits the types of functions that the network can model & the computational structure of the network. This is already quite limited by the dot-product-rectifier common structure (as is used here). Much more interesting and possibly necessary (given much deeper architectures now) is to allow units to change sign. (Open question as to whether they actually frequently do!). As such, the model is in the vein of "how do we make backprop biologically plausible by removing features / communication" rather than "what sorts of signals and changes does the brain use perceive and generate behavior". This is also related to the literature on what ResNets do; what are the skip connections for? Amthropic has some interesting analyses for Transformer architectures, but checking the literature on other resnets is for another time. | |||||
{1568} | |||||
Burst-dependent synaptic plasticity can coordinate learning in hierarchical circuits
| |||||
{1550} |
ref: -2011
tags: government polyicy observability submerged state America
date: 09-23-2021 22:06 gmt
revision:0
[head]
|
||||
The Submerged State -- How Invisible Government Policies Undermine American Democracy. By Suzanne Mettler (I've not read this book, just the blurb, but it looks like a defensible thesis) : Government polyicy, rather than distributing resources (money, infrastructure, services) as directly as possible to voters, have recently opted to distribute indirectly, through private companies. This gives the market & private organizations more perceived clout, perpetuates a level of corruption, and undermines American's faith in their government. So, we need a better 'debugger' for policy in america? Something like a discrete chain rule to help people figure out what policies (and who) are responsible for the good / bad things in their life? Sure seems that the bureaucracy is could use some cleanup / is failing under burgeoning complexity. This is probably not dissimilar to cruddy technical systems. | |||||
{1537} |
ref: -0
tags: cortical computation learning predictive coding reviews
date: 02-23-2021 20:15 gmt
revision:2
[1] [0] [head]
|
||||
PMID-30359606 Predictive Processing: A Canonical Cortical Computation
PMID-23177956 Canonical microcircuits for predictive coding
Control of synaptic plasticity in deep cortical networks
| |||||
{1522} | |||||
Schema networks: zero-shot transfer with a generative causal model of intuitive physics
| |||||
{1428} | |||||
PMID-30420685 Fast in-vivo voltage imaging using a red fluorescent indicator
| |||||
{1486} |
ref: -2019
tags: non degenerate two photon excitation fluorophores fluorescence OPO optical parametric oscillator
date: 10-31-2019 20:53 gmt
revision:0
[head]
|
||||
Efficient non-degenerate two-photon excitation for fluorescence microscopy | |||||
{1470} | |||||
Large-Scale Optical Neural Networks based on Photoelectric Multiplication
| |||||
{1467} |
ref: -2017
tags: neuromorphic optical computing nanophotonics
date: 06-17-2019 14:46 gmt
revision:5
[4] [3] [2] [1] [0] [head]
|
||||
Progress in neuromorphic photonics
See also :
| |||||
{1466} | |||||
Eminently useful. Source: https://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-974-fundamentals-of-photonics-quantum-electronics-spring-2006/lecture-notes/chapter7.pdf Laser Dye technology by Peter Hammond
| |||||
{1465} | |||||
Small gathering of links on Lenslet Labs / Lenslet inc. Founded in 1999.
| |||||
{1463} | |||||
All-optical spiking neurosynaptic networks with self-learning capabilities
| |||||
{1441} | |||||
Assessing the Scalability of Biologically-Motivated Deep Learning Algorithms and Architectures
| |||||
{1452} | |||||
PMID-22325196 How Does the Brain Solve Visual Object Recognition
| |||||
{1446} | |||||
PMID-29074582 A generative vision model that trains with high data efficiency and breaks text-based CAPTCHAs
| |||||
{1445} |
ref: -2018
tags: cortex layer martinotti interneuron somatostatin S1 V1 morphology cell type morphological recovery patch seq
date: 03-06-2019 02:51 gmt
revision:3
[2] [1] [0] [head]
|
||||
| |||||
{1438} | |||||
| |||||
{1437} | |||||
PMID-21280920 Optically sectioned in vivo imaging with speckle illumination HiLo microscopy
| |||||
{1419} | |||||
All-optical machine learning using diffractive deep neural networks
| |||||
{1416} | |||||
Learning data manifolds with a Cutting Plane method
| |||||
{1402} | |||||
PMID-18336081 Adaptive integration in the visual cortex by depressing recurrent cortical circuits.
| |||||
{1384} | |||||
PMID-28246640 Ultraflexible nanoelectronic probes form reliable, glial scar–free neural integration
| |||||
{1387} |
ref: -1977
tags: polyethylene surface treatment plasma electron irradiation mechanical testing saline seawater accelerated lifetime
date: 04-15-2017 06:06 gmt
revision:0
[head]
|
||||
Enhancement of resistance of polyethylene to seawater-promoted degradation by surface modification
| |||||
{1383} |
ref: -0
tags: carbon nanotube densification conductivity strength
date: 02-23-2017 02:52 gmt
revision:2
[1] [0] [head]
|
||||
Super-strong and highly conductive carbon nanotube ribbons from post-treatment methods
High-strength carbon nanotube fibre-like ribbon with high ductility and high electrical conductivity | |||||
{1369} | |||||
PMID-22231664 Vertical nanowire electrode arrays as a scalable platform for intracellular interfacing to neuronal circuits.
| |||||
{1366} |
ref: -0
tags: direct electrical stimulation neural mapping review
date: 01-26-2017 02:28 gmt
revision:0
[head]
|
||||
PMID-22127300 Direct electrical stimulation of human cortex -- the gold standard for mapping brain functions?
| |||||
{1348} | |||||
Heller Lecture - Prof. David Kleinfeld
| |||||
{711} | |||||
PMID-19299587[0] Optical Deconstruction of Parkinsonian Neural Circuitry.
____References____
| |||||
{1318} | |||||
{1308} | |||||
Kinetics of Alkaline Hydrolysis of a Polyimide Surface
| |||||
{1300} |
ref: -0
tags: Peter Ledochowitsch ECoG parylene fabrication MEMS
date: 09-25-2014 16:54 gmt
revision:0
[head]
|
||||
IEEE-5734604 (pdf) Fabrication and testing of a large area, high density, parylene MEMS µECoG array
| |||||
{1296} |
ref: -0
tags: physical principles of scalable neural recording marblestone
date: 08-25-2014 20:21 gmt
revision:0
[head]
|
||||
PMID-24187539 Physical principles for scalable neural recording.
| |||||
{1292} | |||||
PMID-1937509 A silicon-based, three-dimensional neural interface: manufacturing processes for an intracortical electrode array. | |||||
{835} | |||||
So, a year and a half ago I bought a green 1995 900 SE convertible for $600. At that time, it didn't move or go in reverse. Since then, I've been fixing up random things here an there (or just straight modifying / breaking the car by other standards) and recently realized that I had better start keeping track of everything that's been done, in case my memory lapses or i need to know where some random part came from. I doubt this will be useful to anyone else - next time, pictures! Things that I've done to the green convertible, in approximate chronological order:
Things that need to be done to the 'vert:
Now, wonders of wonders, I have another of these cars - though a sedan, not a convertible. It cost much more (about 8x as much), and is hence in much better shape. That said, I've had to do the following:
And now the blue 1998 saab 900, sold to Adam:
Next, the saab 9000 aero:
| |||||
{1225} |
ref: -0
tags: histology optical coherence tomography vasculature avoidance
date: 01-29-2013 06:46 gmt
revision:0
[head]
|
||||
PMID-9766311 Optical coherence tomography for neurosurgical imaging of human intracortical melanoma.
| |||||
{1195} | |||||
PMID-21270781[0] How advances in neural recording affect data analysis.
____References____
| |||||
{1198} | |||||
PMID-22049097[0] Mechanically adaptive intracortical implants improve the proximity of neuronal cell bodies.
____References____
| |||||
{1205} | |||||
PMID-15698656[0] A comparison of chronic multi-channel cortical implantation techniques: manual versus mechanical insertion.
____References____
| |||||
{913} | |||||
PMID-21499255[0] Reversible large-scale modification of cortical networks during neuroprosthetic control.
Other notes:
____References____
| |||||
{1184} | |||||
PMID-22308458 Optically monitoring voltage in neurons by photo-induced electron transfer through molecular wires.
| |||||
{1183} | |||||
PMID-22574249 High spatial and temporal resolution wide-field imaging of neuron activity using quantum NV-diamond.
| |||||
{1182} | |||||
PMID-16050036 Imaging brain activity with voltage- and calcium-sensitive dyes.
| |||||
{1179} | |||||
PMID-20844600 Detection of Neural Action Potentials Using Optical Coherence Tomography: Intensity and Phase Measurements with and without Dyes.
| |||||
{1180} | |||||
PMID-19654752 Detecting intrinsic scattering changes correlated to neuron action potentials using optical coherence imaging.
| |||||
{1168} |
ref: -0
tags: debian linux github persistent ssh authentication
date: 07-27-2012 01:40 gmt
revision:1
[0] [head]
|
||||
If you don't want to repeatedly enter in your username/password for github when commiting, you'll want to enable an RSA authetication key. -- http://www.debian.org/devel/passwordlessssh run ssh-keygen(with no options). -- then https://help.github.com/articles/working-with-ssh-key-passphrases ssh-keygen -pwith your github passphrase (I'm not totally sure this is essential). For me, pull and push aftwerard worked without needing to supply my password. Easy! | |||||
{1093} |
ref: Benabid-2009.01
tags: DBS historical perspective
date: 02-22-2012 14:54 gmt
revision:2
[1] [0] [head]
|
||||
PMID-19660668[0] Functional neurosurgery for movement disorders: a historical perspective.
____References____
| |||||
{1074} | |||||
PMID-19559747[0] Deep brain stimulation in neurological diseases and experimental models: from molecule to complex behavior.
____References____
| |||||
{1131} | |||||
PMID-16758482 "Paradoxical kinesis" is not a hallmark of Parkinson's disease but a general property of the motor system.
| |||||
{1110} |
ref: -0
tags: Seymour thesis electrode lithography fabrication
date: 02-05-2012 17:35 gmt
revision:4
[3] [2] [1] [0] [head]
|
||||
Advanced polymer-based microfabricated neural probes using biologically driven designs.
| |||||
{782} | |||||
IEEE-5067358 (pdf) Wireless, Ultra Low Power, Broadband Neural Recording Microsystem
____References____ Song, Y.-K. and Borton, D.A. and Park, S. and Patterson, W.R. and Bull, C.W. and Laiwalla, F. and Mislow, J. and Simeral, J.D. and Donoghue, J.P. and Nurmikko, A.V. Active Microelectronic Neurosensor Arrays for Implantable Brain Communication Interfaces Neural Systems and Rehabilitation Engineering, IEEE Transactions on 17 4 339 -345 (2009) | |||||
{901} |
ref: Zacksenhouse-2007.07
tags: Zacksenhouse 2007 Odoherty Nicolelis cortical adaptation BMI
date: 01-06-2012 03:10 gmt
revision:3
[2] [1] [0] [head]
|
||||
PMID-17637835[0] Cortical modulations increase in early sessions with brain-machine interface.
____References____
| |||||
{1011} | |||||
IEEE-4120642 (pdf) Mechanical Factors in the Design of Chronic Recording Intracortical Microelectrodes ____References____ Goldstein, Seth R. and Salcman, Michael Mechanical Factors in the Design of Chronic Recording Intracortical Microelectrodes Biomedical Engineering, IEEE Transactions on BME-20 4 260 -269 (1973) | |||||
{940} |
ref: Fritsch-1870
tags: Fritsch Hitzig 1870 electrical stimulation
date: 01-03-2012 23:31 gmt
revision:2
[1] [0] [head]
|
||||
PMID-19457461[0] Electric excitability of the cerebrum (Uber die elektrische Erregbarkeit des Grosshirns).
____References____
| |||||
{240} |
ref: MolinaLuna-2007.03
tags: ICMS microstimulation cortical thin-film electrodes histology MEA
date: 01-03-2012 22:54 gmt
revision:2
[1] [0] [head]
|
||||
PMID-17178423[0] Cortical stimulation mapping using epidurally implanted thin-film microelectrode arrays.
____References____
| |||||
{972} |
ref: Bures-1968
tags: inferior colliculus stimulation classical conditioning plasticity hebb Bures
date: 01-03-2012 07:08 gmt
revision:5
[4] [3] [2] [1] [0] [head]
|
||||
bibtex:Bures-1968 Plastic changes of unit activity based on reinforcing properties of extracellular stimulation of single neurons
| |||||
{928} |
ref: Kennedy-1989.09
tags: Kennedy neurotrophic electrode recording fabrication 1989 electrophysiology
date: 01-03-2012 03:21 gmt
revision:2
[1] [0] [head]
|
||||
PMID-2796391[0] The cone electrode: a long-term electrode that records from neurites grown onto its recording surface.
____References____
| |||||
{760} |
ref: -0
tags: LDA myopen linear discriminant analysis classification
date: 01-03-2012 02:36 gmt
revision:2
[1] [0] [head]
|
||||
How does LDA (Linear discriminant analysis) work? It works by projecting data points onto a series of planes, one per class of output, and then deciding based which projection plane is the largest. Below, to the left is a top-view of this projection with 9 different classes of 2D data each in a different color. Right is a size 3D view of the projection - note the surfaces seem to form a parabola. Here is the matlab code that computes the LDA (from myopen's ceven % TrainData and TrainClass are inputs, column major here. % (observations on columns) N = size(TrainData,1); Ptrain = size(TrainData,2); Ptest = size(TestData,2); % add a bit of interpolating noise to the data. sc = std(TrainData(:)); TrainData = TrainData + sc./1000.*randn(size(TrainData)); K = max(TrainClass); % number of classes. %%-- Compute the means and the pooled covariance matrix --%% C = zeros(N,N); for l = 1:K; idx = find(TrainClass==l); % measure the mean per class Mi(:,l) = mean(TrainData(:,idx)')'; % sum all covariance matrices per class C = C + cov((TrainData(:,idx)-Mi(:,l)*ones(1,length(idx)))'); end C = C./K; % turn sum into average covariance matrix Pphi = 1/K; Cinv = inv(C); %%-- Compute the LDA weights --%% for i = 1:K Wg(:,i) = Cinv*Mi(:,i); % this is the slope of the plane Cg(:,i) = -1/2*Mi(:,i)'*Cinv*Mi(:,i) + log(Pphi)'; % and this, the origin-intersect. end %%-- Compute the decision functions --%% Atr = TrainData'*Wg + ones(Ptrain,1)*Cg; % see - just a simple linear function! Ate = TestData'*Wg + ones(Ptest,1)*Cg; errtr = 0; AAtr = compet(Atr'); % this compet function returns a sparse matrix with a 1 % in the position of the largest element per row. % convert to indices with vec2ind, below. TrainPredict = vec2ind(AAtr); errtr = errtr + sum(sum(abs(AAtr-ind2vec(TrainClass))))/2; netr = errtr/Ptrain; PeTrain = 1-netr; | |||||
{964} |
ref: OLDS-1954.12
tags: Olds Milner operant conditioning electrical reinforcement wireheading BMI
date: 12-29-2011 05:09 gmt
revision:5
[4] [3] [2] [1] [0] [head]
|
||||
PMID-13233369[0] Positive reinforcement produced by electrical stimulation of septal area and other regions of rat brain.
____References____
| |||||
{622} | |||||
PMID-16835359[0] Direct and indirect activation of cortical neurons by electrical microstimulation.
____References____
| |||||
{915} | |||||
-- So cool! How do you come up with something like this? | |||||
{890} | |||||
I'm an avid open-water swimmer, and other than the quarry and beach, I spend many fridays hoping the water in Falls lake is not too choppy. If it's glassy and smooth (and even sometimes when it's not), I can fall into the hypnotic 4/4 chug of stroke-stroke-stroke-breathe, stroke-str ... not hard, since the brown water is featureless, and the above-water scenery doesn't change much either. Several years ago I was out on Falls lake doing my thing, comfortably clear in the middle of the lake, heading back to the beach. In my unawareness I failed to notice that a thunderstorm had grown in the hot summer afternoon. Normally I'm rather debonaire about these things, but have been in places just before they were struck by lightning, and this felt a little like that. So, SOL Tim starts considering the rather limited options (god) (hold breath for as long as possible) (are they the same?). Just then, some Mexican guy on a kayak comes paddling out of ... nowhere ... and asks me if I need help. I bearhug the back of his boat and we get back to shore before the storm breaks. .... Another friday, another season and I set off with a friend clear across Falls lake, which is far, like 3mi round trip. I chat with a Mexican dude before we launch the ships; i guess he seems a bit familiar, but I'm too nervous, eager, and worrying about the thoughts/abilities of my friend to think much. That swim goes fine, minus all the damned speadboats and the ravenous hunger that sets in afterward. Yesterday I had intended to swim at a pool, but some toddling kid chose to contaminate it, and so back to Falls Lake. It's choppy and hard to swim, and I don't make it as far as intended; again before launching, I meet a Mexican dude, and he asks me if I'm crossing the lake again. I tell him no, not enough time; the water envelops, and I'm back in the swim coma, gone to the point when I get back the sun is down and the moon has risen. Surprisingly, when I get back the Mexican guy and his family are still there, slowly cleaning up BBQ debris by the light of highbeams and one crappy flashlight. It's cool and peaceful on the lake, but they probably should have left half an hour ago; as I go to the restroom to change, I wave to the guy and realize two things simultaneously: (1) fuck, it's been the same guy, (2) he may have delayed departure, gracefully and surreptitiously, until I was back. Curiosity makes me want to ask if he had, to see if coincidence licked me again, but that's not right; I did't. | |||||
{813} |
ref: work-0
tags: kicadocaml zbuffer comparison picture screenshot
date: 03-03-2010 16:38 gmt
revision:4
[3] [2] [1] [0] [head]
|
||||
Simple illustration of Kicadocaml with Z buffering enabled: and disabled: I normally use it with Z buffering enabled, but turn it off if, say, I want to clearly see all the track intersections, especially co-linear tracks or zero length tracks. (Probably I should write something to merge and remove these automatically.) Note that in either case, tracks and modules are rendered back-to-front, which effects a Z-sorting of sorts; it is the GPUs Z buffer that is enabled/disabled here. | |||||
{812} | |||||
Aint she pretty? More shots of the completed board (click for full resolution image):
| |||||
{734} | |||||
Rethinking the American Dream by David Kamp
| |||||
{724} | |||||
| |||||
{668} |
ref: notes-0
tags: triangulation kicadocaml
date: 02-04-2009 21:40 gmt
revision:7
[6] [5] [4] [3] [2] [1] [head]
|
||||
PCB copper zones using triangle meshes Abstract: Many tasks in computer-assisted design involve the removal of polygons from other polygons. Particularly, this problem is found when filling a region of a printed circuit board (PCB) with a polygonal zone or 'pour' of copper. This zone is attached to a net, perhaps ground, and hence other tracks, vias, and segments of copper not on the same net but within its region must be avoided by a clearance distance. This clearance can be observed by subtraction of expanded polygons from the original zone's outline polygon, as is done in two open-source PCB design softwares, Kicad and gEDA. Here we present a fast and scalable algorithm that works with triangles instead of polygons. The algorithm is able to mesh, add edges, and remove conflicting triangles within a few seconds for problems involving 10,000 points. Introduction: I have contributed, infrequently, to the open-source electronic design automation (EDA) suite Kicad for the past year or so. November/December of 2007 I added duplicated hierarchal support to Kicad's schematic editor, eeschema, which allows, like many commercial packages, duplicate instances of sub-schematics. This feature is used when a segment of circuitry is duplicated multiple times in a design, perhaps when there are multiple identical channels, e.g. in an audio mixer. However pcbnew (the layout editor in Kicad) is unaware of the duplication, hence for each sub-schematic the layout had to be duplicated. This involved a lot of work for the 8-channel microstimulator board that I was working on at the time, so I decided to implement a small application to help layout an array of duplicated circuitry. Ocaml was chosen to implement the software, as I wanted to learn the language. In the course of working on PCBs, learning Ocaml, and basically scratching a series of itches, the software, tentatively named "Kicadocaml", has become progressively more feature-rich, useful, and tested. It has ratsnest, DRC online and offline checking, push routing, schematic hierarchy comprehension (of course), connectivity testing, bill-of-materials generation, and a responsive OpenGL-based GUI. In my last board, pcbnew failed to fill all the zones; I'm not sure why. I tried to fix the bug, but got lazy/overwhelmed after a while, and decided to just write a zone-filling algorithm from scratch myself (to scratch the itch, so to speak). Sure it's reinventing the wheel, but reinventing is fun. In the interest of documenting the algorithm a bit for posterity, the algorithm is described below. Algorithm: A list is made of all points and segments that may be involved in the zone-fill. This includes, of course, the edges of the zone, as well as the outline of any track/via/pad cutout within the zone (and not of the same net number), expanded to allow for zone clearance and zone-edge stroking. The list of points also must include any intersections between segments. For efficiency, the lists of points and segments are culled by checking each polygon to be subtracted to make sure that at least one of it's points is within the zone polygon; this is done via the standard inside/outside polygon test. The list of points is then incrementally inserted into a linked triangle mesh via a very simple, very effective method of triangle splitting and edge-flipping. Linked triangle mesh means that each triangle stores a index (or pointer) to the triangle off each of its three edges. This is to facilitate the insertion of points: to find the triangle that a point is in, you walk over the linked mesh, crossing the edge between triangles that intersects a ray from the center of the present triangle to the target point. (Given the ordering of points within the list, this can be nearly a constant-time operation). See below.
Once a triangle is found, it is split into three triangles by the addition of the point. Then, each pair of triangles, one new and one old (bordering the triangle that was split) is checked to see if flipping the interior segment would increase the smallest angle. Remarkably, this reliably takes care of edge insertion - no specialized edge insertion routine was required (however, loops in the find triangle algorithm (figure 1) must be eliminated for a triangle to be found when a point is on an edge). I decided to simply maximize the minimum angle in each triangle, rather than observe the Delaunay criteria which doesn't matter for this application.
This algorithm only deals with finding containing triangles and inserting points; hence, it must be seeded with at least one triangle which will contain all others. I chose to use two triangles defined by a slightly-enlarged bounding box of all points to be inserted. The algorithm does not insure that all polygon segments are in the list of edges of a mesh; hence, after all points are inserted, every edge is checked to make sure if it is in the mesh -- see figure 3.
Once all points and all edges from the original list are in the mesh, then each triangle may be tested to see if it should be kept or removed. In kicadocaml this is done with DRC (design rule check) testing.
Afterword: The algorithm runs well; it takes ~ 2 seconds to mesh, edge check, and filter 10,000 points on my Core2 2.4Ghz desktop computer. Though it was written in a higher-level language (about 600 lines of Ocaml), I do not think that it would be hard to port to C++ for inclusion in other PCB layout packages. Great effort was not necessarily put into the design of the algorithm, but rather the numerical stability of it's sub-components, such as the triangle inside-outside check (computed with the cross product), and the segment intersection test. For these, please see the source, or {661}. | |||||
{661} |
ref: -0
tags: computational geometry triangulation ocaml kicadocaml zone fill edge
date: 01-26-2009 01:47 gmt
revision:3
[2] [1] [0] [head]
|
||||
I have been working hard to add zone support to kicadocaml since the implementation in kicad's PCBnew is somewhat borken (at least for my boards). It is not a very easy task! Roughly, the task is this: given a zone of copper pour, perhaps attached to the ground net, and a series of tracks, vias, and pads also on that layer of the PCB but not on the same net, form cutouts in the zone so that there is an even spacing between the tracks/vias and zone. Currently I'm attacking the problem using triangles (not polygons like the other PCB softwares). I chose triangles since I'm using OpenGL to display the PCB, and triangles are a very native mode of drawing in OpenGL. Points are added to the triangle mesh with an incremental algorithm, where the triangles are stored as a linked-mesh : each triangle has a pointer (index#) to the triangle off edge ab,bc,ca. This allows finding the containing triangle when inserting a point a matter of jumping between triangles; since many of the points to be inserted are close to eachother, this is a relatively efficient algorithm. Once the triangle containing a point to be inserted is found, the triangle is split into three, the pointers are updated appropriately, and each triangle is tested to see if flipping with it's pair would result in a net larger smallest interior angle between the two. (This is not the same as Delaunay's criteria, but it is simpler, and it produces equally beautiful pictures.) The problem is when two triangles are allowed to overlap or a gap is allowed - this makes the search algorithm die or get into a loop, and is a major major problem of the approach. In Guibas and Stolfi's paper, "Primitives for the manipulation of general subdivisions and the computation of Voronoi diagrams", they use an edge data structure, rather than a triangle data structure, which I suppose avoids this problem. I was lazy when starting this project, and chose the more obvious triangle-centric way of storing the data. The insertion of points is actually not so hard; the big problem is making sure the edges in the original list of polygons are represented in the list of edges in the triangle mesh. Otherwise, triangles will span edges, which will result in DRC violations (e.g.g copper too close to vias). My inefficient way of doing this is to calculate, for all triangles, their intersections with the polygon segments, then adding this to the mesh until all segments are represented in the list. This process, too, is prone to numerical instability. Perhaps the solution is to move back to an edge-centric data representation, so that certain edges can be 'pinned' or frozen, and hence they are guaranteed to be in the triangle mesh's edge list. I don't know; need to think about this more. Update: I got most of it working; at least the triangulation & making sure the edges are in the triangle mesh are working. Mostly there were issues with numerical precision with narrow / small triangles; I rewrote the inside triangle function to use the cross product, which helped (this seems like the simplest way, and it avoids divisions!): ocaml let insidetri a b c d = cross (sub b a) (sub d a) > 0.0 && cross (sub c b) (sub d b) > 0.0 && cross (sub a c) (sub d c) > 0.0 ;; as well as the segment-segment intersection algorithm: ocaml let intersect a b c d = (* see if two line segments intersect *) (* return the point of intersection too *) let ab = sub b a in (* a prime is the origin *) let bp = length ab in let xx = norm ab in let yy = (-1.) *. (snd xx) , (fst xx) in let project e = (dot (sub e a) xx) , (dot (sub e a) yy) in let cp = project c in let dp = project d in let cd = sub dp cp in let m = (fst cd) /. (snd cd) in let o = (fst cp) -. m *. (snd cp) in let e = add (scl ab (o /. bp)) a in (* cp and dp must span the x-axis *) if ((snd cp) <= 0. && (snd dp) >= 0.) || ((snd cp) >= 0. && (snd dp) <= 0.) then ( if o >= 0. && o <= bp then ( true, e ) else ( false, e ) ) else ( false, e ) ;; Everything was very sensitive to ">" vs. ">=" -- all must be correct. All triangles must be CCW, too, for the inside algorithm to work - this requires that points to be inserted close to a triangle edge must be snapped to that edge to avoid any possible CW triangles. (Determining if a triangle is CW or CCW is as simple as measuring the sign of the smallest cross product between two segments). I tried, for a day or so, to include a specialized function to insert points along a triangle's edge, but that turned out not to matter; the normal flipping routine works fine. I also tried inserting auxiliary points to try to break up very small triangles, but that really didn't affect the stability of the algorithm much. It is either correct, or it is not, and my large board was a good test suite. I have, however, seeded the triangularization with a grid of (up to) 20x20 points (this depends on the aspect ratio of the region to be filled - the points are equally spaced in x and y). This adds (max) 800 triangles, but it makes the algorithm more stable - fewer very narrow triangles - and we are working with sets of 10,000 triangles anyway for the large zones of copper. Some corrections remain to be done regarding removing triangles based on DRC violation and using the linked-mesh of triangles when calculating edge-triangle edge intersection, but that should be relatively minor. Now I have to figure out how to store it in Kicad's ".brd" file format. Kicad uses "Kbool" library for intersection polygons - much faster than my triangle methods (well, it's in C not ocaml) - and generates concave polygons not triangles. Would prefer to do this so that I don't have to re-implement gerber export. (Of course, look at how much I have re-implemented! This was originally a project just to learn ocaml - Well, gotta have some fun :-) | |||||
{644} | |||||
Section 2: Microcontroller & microsteppingAs mentioned before, we chose MSP430F5438 100-pin 16 bit microcontroller because it offers sufficient timers and speed for our problem and because we were both familiar with the architecture. Four 16-bit timers are used to control microstepping mirror tilt and pan, since the stepper motors have two phases. The microcontroller only needs to provide digital signals; current is provided through H-bridge drivers in the control board of the mm-150 - the DIPs with heat sinks below.Opposite sides of the H-bridge are driven via hex inverters; hence, we only have to supply two PWM signals per motor, one per phase. Setting the PWM duty cycle to 50% will set the motor phase current to zero; by vectoring the duty cycle proportional to the sine and cosine of theta, where theta is the orientation of the motor * number of poles of the stepper, you can control microstepping. That, of course, is simplified; in practice, there are many details to contend with, namely:
We approximated sine and cosine, needed to vector the stepper motor phase currents, in fixed-point arithmetic first in C on linux - where the results could be plotted in matlab - before converting to MSP430 code. Since the trigonometric functions are repeating, we only need a polynomial approximation of sine from 0 to pi/2. The taylor series for sine is sin(x) = x - x^3/3! + x^5/5! - x^7/7! ...; a quick check in matlab showed that the first three terms are enough to get an accurate approximation in the domain of interest. The MSP430 does not have division, however, so we approximated 1/3! = 1/6 as (1/8 + 1/32 + 1/128) and 1/5! = 1/120 as 1/128; division by powers of two is possible with right bit-shift operations. We chose base 11 (5 bits whole, 11 bits fractional) representation to avoid overflow: if 2^11 -> 1, we need to represent (pi/2)^5 -> 9.5 ; ceil(log_2(9.5)) = 4 (plus one bit for safety). The C program below shows this test. #include <stdio.h> char qsin(short i){ //i goes from 0 pi/2 base 11 or... // 0 to 3217 unsigned int cube, fifth, result; cube = (i*i) >> 11; cube = (cube*i) >> 11; //max = 7937 fifth = (cube*i) >> 11; fifth = (fifth*i) >> 11; // max = 19585 //our approximation to sine based on taylor series: //original: sin(x) = x - x^3/3! + x^5/5! //sin(x) = x - x^3*(1/8+1/32+1/128) + x^5*(1/128) result = (unsigned int)i - ((cube >> 3) + (cube >> 5) + (cube >> 7)) + (fifth >> 7); //result is base 11. need it to be base 7. result = result >> 4; if(result > 127) result = 127; return (char)result; } //this is tricky, as it involves shifts, x-inversions, and y-inversions. //but it all makes sense if you plot out the respective functions. char isin(short i){ // i is base 2^11 //but we accept 0 to 2*pi or 12867 if(i >= 0 && i < 3217) return qsin(i); else if(i >= 3217 && i < 6434) return qsin(6434 - i); else if(i >= 6434 && i < 9651) return -1*qsin(i - 6434); else if(i >= 9651 && i < 12867) return -1*qsin(12867 - i); else return 0; } char icos(short i){ // i is base 2^11 //but we accept 0 to 2*pi or 12867 if(i >= 0 && i < 3217) return qsin(3217 - i); else if(i >= 3217 && i < 6434) return -1*qsin(i - 3217); else if(i >= 6434 && i < 9651) return -1*qsin(9651 - i); else if(i >= 9651 && i < 12867) return qsin(i - 9651); else return 0; } int main(void){ short i; for(i=0; i<12867; i++){ printf("%d\t%f\t%d\t%d\n", i, ((float)i)/2048.0, (int)(isin(i)), (int)(icos(i))); } return 0; } We compiled and ran this program on the command line: gcc integer_trig.c ./a.out > test.txt Then we imported the data into matlab and plotted (Actual double floating-point sine and cosine are plotted on the same axis as thin black and magenta lines, respectively) Later, we had to change the naive standard implementation of multiply to assembly to properly implement the fixed-point arithmetic - the MSP430's standard library did not implement the 16x16 multiply followed by shift correctly (it only keeps the bottom 16 bits). Note: this assembly function is for use with Code-Composer Studio, available from the Texas Instruments website. It seems that the IAR compiler uses different assembly syntax. ;******************************************************************************* .cdecls C,LIST,"msp430x54x.h" ; Include device header file ;------------------------------------------------------------------------------- .text ; Progam Start ;------------------------------------------------------------------------------- ;;.sect "mply_11" ;;.asmfunc "mply_11" .global mply_11 ;; this MUST BE PRECEDED BY TABS !!!!! mply_11: PUSH SR ; DINT ; turn off interrupts here. NOP ; required after DINT MOV.W R12, &MPY ; load the first operand. MOV.W R13, &OP2 ; load the second operand & start multiplication. MOV.W &RESLO, R12 ; low to R12 (this is the return value) MOV.W &RESHI, R13 ; high to R13 RRA.W R12 ; 1 RRA.W R12 ; 2 RRA.W R12 ; 3 RRA.W R12 ; 4 RRA.W R12 ; 5 RRA.W R12 ; 6 RRA.W R12 ; 7 RRA.W R12 ; 8 RRA.W R12 ; 9 RRA.W R12 ; 10 RRA.W R12 ; 11 RLA.W R13 ; 1 RLA.W R13 ; 2 RLA.W R13 ; 3 RLA.W R13 ; 4 RLA.W R13 ; 5 ;; r14 can be clobbered across a function call, according to the msp430 ABI MOV.W #0x001f, R14 AND.W R14, R12 ; mask off all but the bottom 5 bits from RESLO ADD.W R13, R12 ; add (logical OR) the results. R12 is the 11-bit fixed point result. POP.W SR ; RETA ; return from subroutine. .end Note the MSP430 does not have an opcode for multiple arithmetic shifts, nor does it have code for logical shifts - hence the need for repeated shifts and bitmasks! #include <msp430x54x.h> #define INCR 1 #define PI2 (12868) //we use a 11 bit fixed-point representationf of motor angles. // 12867 = 2*pi*2^11. #define TIMER_SCL 128 #define SHUTTER_CLOSED 0 //defines used in the state-machine control of the shutter. #define SHUTTER_OPEN 1 #define SHUTTER_SMALL 2 //Start of Stepper Motor Program //ME270 Project short theta1 = 0; //the MSP430 is a 16-bit processor. short theta2 = 0; //hence, most datatypes should be 'short' for efficiency. short theta1_v = 0; //we cannot control the poition of the stepper motors directly, short theta2_v = 0; // since we only have 3 bits of control from the parallel port. // also, direct position control of postion would cause the stepper to miss steps // smooth position change and limited acceleration is guaranteed by controlling the velocity. short shutter_state = 0; // none of the steppers have encoders, // so we keep track of the shutter position here. short shutter_cmd ; //this is set in ISR (interupt service routine) // and read, and acted upon, in the main loop. short qsin(short i){ //i goes from 0 pi/2 base 11 or... // 0 to 3217 short cube, fifth, result; cube = mply_11(i,i); cube = mply_11(cube, i); fifth = cube; fifth = mply_11(fifth, i); fifth = mply_11(fifth, i); //our approximation to sine based on taylor series: //original: sin(x) = x - x^3/3! + x^5/5! //sin(x) = x - x^3/(8+32+128) + x^5/128 result = i - ((cube >> 3) + (cube >> 5) + (cube >> 7)) + (fifth >> 7); //result is base 11. need it to be base 7. (0 to 127) result = result >> 4; if(result > TIMER_SCL) result = TIMER_SCL; return (short)result; } // this is an even more simplified version of sin - // made in an attempt to make the microstepping smoother. // it turned out to not matter very much. to get very smooth stepping , // may have to develop an inverse model of the nonlinear stepper motors // ** quantitatively ** short qsin2(short i){ //i goes from 0 pi/2 base 11 or... // 0 to 3217 short cube, result; cube = mply_11(i,i); cube = mply_11(cube, i); //our approximation to sine based on taylor series: //original: sin(x) = x - x^3/3! + x^5/5! //sin(x) = x - x^3/(8+32+128) + x^5/128 result = i - (cube >> 3) ; //result is base 11. need it to be base 7. result = result >> 4; if(result > TIMER_SCL) result = TIMER_SCL; //maximum.. return (short)result; } short isin(short i){ // i is base 2^11 //but we accept 0 to 2*pi or 12867 if(i >= 0 && i < 3217) return qsin(i); else if(i >= 3217 && i < 6434) return qsin(6434 - i); else if(i >= 6434 && i < 9651) return -1*qsin(i - 6434); else if(i >= 9651 && i < 12867) return -1*qsin(12867 - i); else return 0; } short icos(short i){ // i is base 2^11 //but we accept 0 to 2*pi or 12867 if(i >= 0 && i < 3217) return qsin(3217 - i); else if(i >= 3217 && i < 6434) return -1*qsin(i - 3217); else if(i >= 6434 && i < 9651) return -1*qsin(9651 - i); else if(i >= 9651 && i < 12867) return qsin(i - 9651); else return 0; } //this interrupt is triggered by the parallel port. //because we only have 3 lines and need 8 commands, //after triggering (0 to 1 transition on PORT2.0 ), //the control program on the PC will either hold the pin up // (indicating a velocity step command) or drop it (indicating shutter/stop cmd). #pragma vector=PORT2_VECTOR __interrupt void port2_ISR (void) { //need to read the two pins to figure out which axis to change. short k; for(k=0; k<8; k++){ P9OUT ^= 0x4; } switch(P2IN & 0x7){ case 1: theta1_v += INCR; break; case 3: theta1_v -= INCR; break; case 5: theta2_v += INCR; break; case 7: theta2_v -= INCR; break; case 0: shutter_cmd = SHUTTER_CLOSED; break; case 2: shutter_cmd = SHUTTER_SMALL; break; case 6: shutter_cmd = SHUTTER_OPEN; break; case 4: theta1_v = 0; theta2_v = 0; break; } P2IFG = 0; //clear the interupt. } #pragma vector=TIMER1_A0_VECTOR __interrupt void timera1_ISR (void) { return; //if this vector is not here and the interupt is enabled, then the proc will crash! } // have to integrate the velocity at a consistent rate, // hence we pushed integration as well as the sine/cosine computation // into this timer interrupt. #pragma vector=TIMER1_A1_VECTOR __interrupt void timera11_ISR (void) { short ps, pc; P1OUT ^= 0xFF; //toggle P1 to indicate the update rate. (the led is there) TA1CTL = 0x0004; //reset counter TA1CTL = 0x0112; //turn back in interrupts. theta1 += theta1_v; theta2 += theta2_v; if(theta1 > PI2) theta1 -= PI2; if(theta1 < 0) theta1 += PI2; if(theta2 > PI2) theta2 -= PI2; if(theta2 < 0) theta2 += PI2; ps = isin(theta1)+TIMER_SCL; pc = icos(theta1)+TIMER_SCL; TA0CCR1 = ps; //update the counter (PWM output) registers. TA0CCR4 = pc; ps = isin(theta2)+TIMER_SCL; pc = icos(theta2)+TIMER_SCL; TA0CCR2 = ps; TA0CCR3 = pc; P1OUT ^= 0xFF; //toggle P1 to indicate the update rate. (the led is there) return; } //delay is used in moving the shutter. // too short, and the stepper motor controlling the shutter will skip steps! void delay(short time){ short k; short j = 0; for(k=0; k<time; k++){ j++; j++; } } void delay_long(short time){ short k,j,f; for(k=0; k<time; k++){ f = 0; for(j=0; j<100; j++){ f++; } } } // ideally, we would ramp the shutter velocity up and down to maximize speed // and minimize time - constant velocity works fine and fast. #define SHUTDLY 1600 void shutter_ccw(void){ P9OUT = 0x1; delay(SHUTDLY); P9OUT = 0x3; delay(SHUTDLY); P9OUT = 0x2; delay(SHUTDLY); P9OUT = 0x0; delay(SHUTDLY); } void shutter_cw(void){ P9OUT = 0x2; delay(SHUTDLY); P9OUT = 0x3; delay(SHUTDLY); P9OUT = 0x1; delay(SHUTDLY); P9OUT = 0x0; delay(SHUTDLY); } void shutter_open(void){ short i; if(shutter_state == SHUTTER_CLOSED){ //I was quite pleased to discover that the three shutters states // are exactly 5 full steps apart! for(i=0; i<5; i++){ shutter_ccw(); } } if(shutter_state == SHUTTER_SMALL){ for(i=0; i<5; i++){ shutter_cw(); } } shutter_state = SHUTTER_OPEN; } void shutter_close(void){ short i; if(shutter_state == SHUTTER_OPEN){ for(i=0; i<5; i++){ shutter_cw(); } } if(shutter_state == SHUTTER_SMALL){ for(i=0; i<10; i++){ shutter_cw(); } } shutter_state = SHUTTER_CLOSED; } void shutter_small(void){ short i; if(shutter_state == SHUTTER_OPEN){ for(i=0; i<5; i++){ shutter_ccw(); } } if(shutter_state == SHUTTER_CLOSED){ for(i=0; i<10; i++){ shutter_ccw(); } } shutter_state = SHUTTER_SMALL; } void main (void){ //SR = 0x02; short t1, t2, ps, pc; short k; WDTCTL = WDTPW + WDTHOLD; //stop the watchdog timer. // UCSCTL = Universal clock system control (registers). // sets the core clock of the device. _bis_SR_register(SCG0); //SR = SR | 0x40 ; // setup the digitally controlled oscillator. UCSCTL0 = 0x0700; //DCO = 5, MOD = 0 UCSCTL1 = 0x0060; //DCORSEL = 3, middle freq. UCSCTL2 = 0x101F; //FLL (frequency locked loop); doesnt matter here. UCSCTL4 = 0x0333; //select DCOCLK for all clock sources UCSCTL0 = 0x0900; //DCO = 9, MOD = 0 // DCO = internal high-frequency oscillator). //UCSCTL5 = 0x0000; // setup timer A (for controlling PWM outputs) TA0CCR0 = TIMER_SCL*2+1; //Timer A end pulse TA0CCR1 = TIMER_SCL; //Timer A start pulse TA0CCR2 = TIMER_SCL; //Timer A start pulse TA0CCR3 = TIMER_SCL; //Timer A start pulse TA0CCR4 = TIMER_SCL; //Timer A start pulse TA0CTL = 0x0110; //TASSEL = ACLK; input divider=1; MCx = count up mode; TA0CCTL0 = 0x0040; //sets the mode of the output: here=2, toggle/reset. // (produces pulses at 8Khz). TA0CCTL1 = 0x00C0; //output mode: toggle/set. TA0CCTL2 = 0x00C0; // same TA0CCTL3 = 0x00C0; // same TA0CCTL4 = 0x00C0; // same //setup timer B (for controlling theta & velocity updates). TA1CCR0 = 10000; //Timer A end pulse TA1CCR1 = 5000; //Timer A start pulse TA1CCR2 = 5000; //Timer A start pulse TA1CTL = 0x0004; TA1CTL = 0x0112; //TASSEL = ACLK; input divider=1; MCx = count up mode; TA1CCTL0 = 0x0050; //sets the mode of the output: here=2, toggle/reset. // (produces pulses at 8Khz). TA1CCTL1 = 0x00C0; //output mode: toggle/set. TA1CCTL2 = 0x00C0; // same P1DIR = 0x03; //P1.0 and P1.1 to output. (the LED) P1SEL = 0x00; P1OUT = 0; P8DIR = 0xFF; //for some reason Port 1 does not work for the dev board -- P8SEL = 0x7F; //hence, we switched over to Port 8, which also is connected // to the timers. // the P8SEL register selects the timer output as opposed to general purpose IO. //setup port2 (computer command via parallel port) interrupt. P2DIR = 0; //all inputs. P2IFG = 0; P2IE = 0x01; //enable interupts on P2.0 P2IES = 0; // low to high edge detect. _bis_SR_register(GIE | SCG0 ); //enable interrupts, dont go to sleep. P9DIR = 0x07; //test the shutter. first move all the way to the limit. // since we do not know the initial position. for(k=0; k<30; k++){ shutter_cw(); } shutter_ccw(); //step one out so we don't hit the limits later. shutter_state = SHUTTER_CLOSED; //this is where the init will leave it while(1){ //now just sit here waiting for a shutter command from the // parallel port ISR. if(shutter_state != shutter_cmd){ switch(shutter_cmd){ case SHUTTER_OPEN: shutter_open(); break; case SHUTTER_CLOSED: shutter_close(); break; case SHUTTER_SMALL: shutter_small(); break; } } } } We has some problem getting Port1 to work, hence had to use Port8 to get the PWM signals out -- see below. Note the shutter does not need to be microstepped and instead can be controlled as per a conventional stepper motor. The pins used are marked in yellow; pin 57 is a simple pulse output. Note that each PWM signal is generated from the same timer counter, hence they are synchronous (this is of course not necessary). Below are some examples of two phases of one motor output; in real life, of course, the PWM ratio continually changes. Below is the development board being probed to produce the plots above. We then used the pinouts of the NXP microcontrollers, intuited last time by probing their on-line function (specifically the auto-calibration sequence upon startup), to wire up a harness for external control of the H-bridges. Below is a picture of that (we removed the original microcontrollers to prevent contention), and the associated wiring labels.
The next task was to make a 5V to 3.2V regulator (the MSP430 only runs at 3.2V, max), nothing major just a LM317. See below. Finally, everything was wired together. The 3.2 V supply was jumpered, as the MSP430 USB programmer provided its own power. (Amazingly, the ultra low power MSP430 could run on power from the parallel port, too!) A level translator is needed to properly interface the 3.2V MSP430 to the 5V parallel port - we canibalized a spare JTAG adapter for this purpose. It was this that limited us to only 3 bits of control. And that, minus the difficulty we had getting the compiler working properly, is the entirety of the microcontroller part of the project. | |||||
{624} | |||||
Section 1 : Reverse-engineering the light, part selectionRather than engineering our own articulated spotlight, we elected to buy a moving-mirror DJ light; creating our own light source would simply have taken too much time, and demanded optical experience that we lack. After a brief survey, we bought an Elekralite mm150 (moving mirror, 150W bulb) DJ light, one of the cheapest on the market ($650); despite this, it is very well constructed, as you will see below. The light was originally controlled through the stage-specific DMX bus, but the possibility of directly controlling the light through this was discarded after we learned that the resolution on each axis is only 8 bits (+- 127); given the large range of the pan mirror, this is insufficient for tracking. Hence we decided to reverse engineer the light to determine the best way to directly control the mirror and shutter.
| |||||
{641} | |||||
A friend has many Excel files that he converts to labels for affixing to packages to be shipped. To print the proper number of labels (rather than one label with Qty=20), he needs to duplicate rows in the source excel file based on the Qty column. If you export the excel file to XML, this script should do the trick (you'll have to import the resultant XML): #!/usr/bin/perl $narg = $#ARGV + 1; if( $narg ne 2 ){ print "please specify the file to read followed by the file to write on the command line\n"; }else{ $source = $ARGV[0]; $dest = $ARGV[1]; local( $/) ; $/ = ""; open(FH, "< $source"); open(FHO, "> $dest"); $j = <FH>; #slurp the entire file into one string. # look for the header - if( $j =~ s/(.*?)<Sheet1>/<Sheet1>/s){ print FHO $1 ; } while ($j =~ /(<Sheet1>.*?<\/Sheet1>)/gs ){ $newl = $1; if( $newl =~ /<Qty>(\d+)<\/Qty>/ ){ $qty = $1; $newl =~ s/<Qty>\d+<\/Qty>/<Qty>1<\/Qty>/ ; for( $g=0; $g<$qty; $g++){ print FHO $newl ; } } } print FHO "</dataroot>" ; # assume that the footer is always this close FH; close FHO; }not very complicated, but worth posting, I guess. More examples on the internet = better ;-) Note that I hard-coded to split on <Sheet1> -- check your XML files!! | |||||
{627} | |||||
PMID-9530495[0] Cortical plasticity: from synapses to maps
____References____ | |||||
{601} | |||||
http://www.clinicaltrials.gov/ct2/show/NCT00558766?cond=Parkinson+Disease&rank=4 Salient points:
| |||||
{579} | |||||
oldies but goodies:
Both are in Debian of course :) | |||||
{545} |
ref: notes-0
tags: telecommunications FCC wireless regulation government
date: 02-26-2008 04:18 gmt
revision:2
[1] [0] [head]
|
||||
http://news.zdnet.com/2010-1035_22-6231729.html
| |||||
{537} | |||||
{503} | |||||
quote: Consumers also pay high taxes for telecommunication services, averaging about 13 percent on some telecom services, similar to the tax rate on tobacco and alcohol, Mehlman said. One tax on telecom service has remained in place since the 1898 Spanish-American War, when few U.S. residents had telephones, he noted. "We think it's a mistake to treat telecom like a luxury and tax it like a sin," he said. from: The internet could run out of capacity in two years comments:
| |||||
{480} |
ref: bookmark-0
tags: RonPaul American presidential candidate libertarian
date: 10-30-2007 22:38 gmt
revision:0
[head]
|
||||
http://www.grist.org/feature/2007/10/16/paul/?source=weekly
| |||||
{378} | |||||
http://www.palowireless.com/infotooth/tutorial/baseband.asp
| |||||
{464} | |||||
The problem: I have an interrupt status routine (ISR) which can interrupt the main, radio-servicing routine at any time. To keep the ISR from corrupting the register values of the main routine while it works, these registers must be pushed, and later popped, to the stack. Now, doing this takes time, so I'd prefer to pop / push as few registers as possible. Namely, I don't want to push/pop the hardware loop registers - LC0 (loop counter 0), LB0 (loop bottom 0, where the hardware loop starts) & LT0 (loop top 0, where the hardware loop ends). Gcc seems to only touch bank 1, never bank 0, so I don't have to save the 3 regs above. However, to make sure, I've written a perl file to examine the assembled code: my $file = "decompile.asm"; open(FH, $file); @j = <FH>; my $i=0; my @badregs = ("LC0", "LB0", "LT0"); foreach $reg (@badregs){ foreach $k (@j){ if($k =~ /$reg/){ $i++; print "touch register $reg : $k"; } } } #tell make if we found problems or not. if($i>0){ exit 1; }else{ exit 0; } 'make' looks at the return value perl outputs, as instructed via the makefile (relevant portion below): headstage.ldr:headstage.dxe rm -f *.ldr $(LDR) -T BF532 -c headstage.ldr $< bfin-elf-objdump -d headstage.dxe > decompile.asm perl register_check.pl if it finds assembly which accesses the 'bad' registers, make fails. | |||||
{403} |
ref: bookmark-0
tags: blackfin ELF freestanding applications boot
date: 08-01-2007 14:40 gmt
revision:0
[head]
|
||||
http://www.johanforrer.net/BLACKFIN/index.html very good, very instructive. | |||||
{373} | |||||
http://xtronics.com/reference/viscosity.htm the source site - http://xtronics.com/ - has a lot of interesting information. The author seems as enamored with Debian as I am. (hence, there is plenty of Debian information there :) for example, they have a quick reference on kicad: http://xtronics.com/reference/kicad.html | |||||
{372} | |||||
oh yea!!! nice work mate!! http://www.rohrbacher.net/kicad/quicklib.php btw, kicad is the shit - and it is now in Debian!! I love debian! I love kicad! | |||||
{133} | |||||
PMID-15727537 The mesocortical dopamine projection to anterior cingulate cortex plays no role in guiding effort-related decisions. | |||||
{23} |
ref: Vyssotski-2006.02
tags: neurologger neural_recording recording_technology EEG SUA LFP electrical engineering
date: 02-05-2007 06:21 gmt
revision:6
[5] [4] [3] [2] [1] [0] [head]
|
||||
PMID-16236777[0] Miniature neurologgers for flying pigeons: multichannel EEG and action and field potentials in combination with GPS recording. Recording neuronal activity of animals moving through their natural habitat is difficult to achieve by means of conventional radiotelemetry. This illustration shows a new approach, exemplified by a homing pigeon carrying both a small GPS path recorder and a miniaturized action and field potential logger (“neurologgerâ€), the entire assembly weighing maximally 35 g, a load carried easily by a pigeon over a distance of up to 50 km. Before release at a distant location, the devices are activated and store both positional and neuronal activity data during the entire flight. On return to the loft, all data are downloaded and can be analyzed using software for path analysis and electrical brain activity. Thus single unit activity or EEG patterns can be matched to the flight path superimposed on topographical maps. Such neurologgers may also be useful for a variety of studies using unrestrained laboratory animals in different environments or test apparatuses. The prototype on the hand-held pigeon records and stores EEG simultaneously from eight channels up to 47 h, or single unit activity from two channels during 9 h, but the number of channels can be increased without much gain in weight by sandwiching several of these devices. Further miniaturization can be expected. For details, see Vyssotski AL, Serkov AN, Itskov PM, Dell Omo G, Latanov AV, Wolfer DP, and Lipp H-P. Miniature neurologgers for flying pigeons: multichannel EEG and action and field potentials in combination with GPS recording. [1] ____References____ | |||||
{147} | |||||
PMID-12899253 Boosting bit rates and error detection for the classification of fast-paced motor commands based on single-trial EEG analysis
| |||||
{77} |
ref: Kilgard-1998.03
tags: dopamine basal_forebrain nucleus_basalis cortical_plasticity
date: 0-0-2007 0:0
revision:0
[head]
|
||||
PMID-9497289[0] Cortical map reorganization enabled by nucleus basalis activity
| |||||
{81} |
ref: Stapleton-2006.04
tags: Stapleton Lavine poisson prediction gustatory discrimination statistical_model rats bayes BUGS
date: 0-0-2006 0:0
revision:0
[head]
|
||||
{66} |
ref: bookmark-0
tags: machine_learning classification entropy information
date: 0-0-2006 0:0
revision:0
[head]
|
||||
http://iridia.ulb.ac.be/~lazy/ -- Lazy Learning. | |||||
{64} |
ref: bookmark-0
tags: neural_recording recording_technology electrical engineering DSP
date: 0-0-2006 0:0
revision:0
[head]
|
||||
| |||||
{40} |
ref: bookmark-0
tags: Bayes Baysian_networks probability probabalistic_networks Kalman ICA PCA HMM Dynamic_programming inference learning
date: 0-0-2006 0:0
revision:0
[head]
|
||||
http://www.cs.ubc.ca/~murphyk/Bayes/bnintro.html very, very good! many references, well explained too. |