[HN Gopher] WebGPU-Based WiFi Simulator
___________________________________________________________________
WebGPU-Based WiFi Simulator
Author : jasmcole
Score : 321 points
Date : 2024-10-20 18:01 UTC (1 days ago)
(HTM) web link (wifi-solver.com)
(TXT) w3m dump (wifi-solver.com)
| jasmcole wrote:
| See also the blog post here discussing this project:
|
| https://jasmcole.com/2024/10/18/a-decade-of-wifi/
| noahbp wrote:
| It's so frustrating that WebGPU support was released 1.5 years
| ago on Chrome, and yet is still unavailable on all other
| browsers.
|
| This is a real killer feature that will dramatically slow
| adoption of non-Chromium browsers, even with Google defanging ad
| blockers.
| jasmcole wrote:
| Agreed! Though support should be coming soon it seems. As a
| complete WebGPU novice I was really impressed with how quick it
| was to get going.
| gnarbarian wrote:
| it's still not well supported on Linux unfortunately either
| pjmlp wrote:
| Even Chrome only supports it officially on Windows, macOS and
| Android, no GNU/Linux (as stable).
|
| And when it becomes widespread, just like WebGL 2.0, it will be
| a decade behind of what native APIs are capable of.
|
| And in both cases, good luck debugging, other than replicating
| the content on native APIs, as means to use proper GPU
| debuggers, because even Chrome has yet to offer any developer
| tooling for GPU debugging.
| petermcneeley wrote:
| Runs great on my ChromeBook.
| pjmlp wrote:
| Forgot about that, which isn't GNU/Linux anyway.
| murderfs wrote:
| By what metric? It's a gentoo deriviative with glibc,
| coreutils, etc.
| pjmlp wrote:
| A JavaScript userspace juggling Chrome instances.
| murderfs wrote:
| ...no, it isn't?
|
| Even if you're claiming (incorrectly) that the window
| manager, etc. contain javascript, the same would apply to
| GNOME!
| pjmlp wrote:
| GNOME allows GNU userland to be used.
| SoKamil wrote:
| ChromeOS is not a Linux distribution, change my mind.
| yjftsjthsd-h wrote:
| ChromeOS is a Linux kernel with some software bundled on
| top to make a usable system; it is by definition a Linux
| distro. Curiously, it's even a GNU/Linux distro, as it
| uses glibc and GNU coreutils, unlike ex Android which is
| a non-GNU distro.
|
| I will grant that it's a slightly odd distro, but is it
| any weirder than NixOS or Fedora Silverblue?
| pjmlp wrote:
| Only runs browser instances. Even Crostini is sandoxed in
| a way similar to WSL2.
| yjftsjthsd-h wrote:
| User-facing apps are browser instances and VMs, and under
| that is a pretty normal userland. It's still a
| distribution of software on a Linux kernel. And for that
| matter, is Silverblue any less a Linux distro with its
| read-only root and apps in flatpak/distrobox? Are Qubes
| OS or Proxmox with everything in VMs?
| pjmlp wrote:
| People buying a Chromebook down at the mall will never
| see GNU userland.
|
| Folks using Silverblue and Flatpak distributions get to
| use GNU userland.
| koolala wrote:
| No luck on Steam Deck :(
| moffkalast wrote:
| For Safari that's par for the course, but Firefox is in
| surprisingly far behind in terms of anything GPU related in the
| browser.
|
| I've recently been shocked trying out the WebGL aquarium demo
| [0] on Chrome and Firefox after running into some really odd
| performance issues on a project. You'd expect them to behave
| about the same with GPU acceleration, but FF barely gets half
| the framerate at the same load. Like, what?! On Linux FF is
| also several times slower at canvas rendering.
|
| [0] https://webglsamples.org/aquarium/aquarium.html
| epuixrk wrote:
| I'm not an expert but I think it works on IOS with Safari.
| You have to enable WebGPU in the extra flag category in the
| settings app.
|
| But I still need to figure out what exactly this is.
| givinguflac wrote:
| Can confirm, I have it enabled on iOS 18.1 and this seems
| to work fine.
| soheil wrote:
| Why do you need webgpu? It's unfortunate that people use
| technology that is "state-of-the-art techniques to run
| simulations at interactive speeds" without fully understanding
| what it's for. General compute on GPU is what webgpu is for..
| To simulate basic waves like in this demo you absolutely do not
| need that, in fact it's an indication the author implemented
| the solution in a non-optimal way. WebGL is fully supported by
| all browsers fully supported by well-maintained libs like 3js,
| yet here we are people writing a sin function with basic
| interference patterns, one of the most elementary 3D
| primitives, in webgpu and argue that's using the "state-of-the-
| art" techniques.
| jasmcole wrote:
| Good question! This is actually a numerical solver for a few
| coupled partial differential equations - the method in this
| context (electromagnetism) is called FDTD. It's implemented
| as a WebGPU compute shader.
|
| You absolutely could do this using WebGL2 compute shaders
| too, but I thought it would be fun to try this newer API.
| zorgmonkey wrote:
| Annoyingly WebGL2 doesn't have compute shaders even though
| GLES3.x that it is based on does.
| pjmlp wrote:
| Thank Google for that, as they dropped Intel contribution
| to WebGL Compute, with the reasoning WebGPU would be good
| enough.
| soheil wrote:
| I don't understand what other type of solution is there to
| render on a gpu other than a numeric one?
|
| Here is a very basic shader for what you want:
| float freq1 = 2.0; float freq2 = 3.0; float amp
| = 0.5; pos.z += sin(pos.x * freq1 + uTime) *
| amp; pos.z += cos(pos.y * freq2 + uTime) * amp;
| gl_Position = projectionMatrix * modelViewMatrix *
| vec4(pos, 1.0);
| vardump wrote:
| That's no solver, it just displays a sine wave pattern.
| dankwizard wrote:
| Did ChatGPT write that for you because it has missed the
| mark by 500 metres.
| soheil wrote:
| It's a sin + cos function.. you need an AI for that?
| _flux wrote:
| The point was that the implementation of this tool is not
| a sin+cos function. It's more like let
| newEz = Ez0[me] + calcEzDiff(vec2u(id.x, id.y), dx, dy,
| aspect); let newEzAbove = Ez0[above] +
| calcEzDiff(vec2u(id.x, id.y + 1), dx, dy, aspect);
| let newEzRight = Ez0[right] + calcEzDiff(vec2u(id.x + 1,
| id.y), dx, dy, aspect); Hx1[me] = Hx0[me] -
| (uniforms.dt/mu0)*(newEzAbove - newEz) / dy;
| Hy1[me] = Hy0[me] + (uniforms.dt/mu0)*(newEzRight -
| newEz) / dx; Ez1[me] = newEz; let
| localDelta = delta[me]; let fac = 1 +
| uniforms.omega * uniforms.dt * (delta[me] / eps[me] / 2);
| Ez1[me] = Ez1[me] / fac; Hx1[me] = Hx1[me] / fac;
| Hy1[me] = Hy1[me] / fac;
|
| and then a bunch of other GPU code. You can find this
| with little effort from the bundle, if you care, by
| base64-decoding the Pt("xxx") parts.
|
| Though I do imagine it indeed could be implementable with
| WebGL shaders, but I also wouldn't start a new compute-
| based on it, unless I had a particular need to support
| older systems. And this I say as a Firefox user..
| jsheard wrote:
| Especially frustrating in the case of Safari, which only needs
| to support one native API backend (Metal) on a pretty narrow
| set of hardware and drivers. Firefox has a much bigger task
| with needing to support everything, like Chrome, but with far
| less resources than Google or Apple can afford to throw at it.
| aabhay wrote:
| Its in technology preview, so likely to go GA at the next
| major OS cycle (1yish)
| jsheard wrote:
| I'm not holding my breath, their WebGL2 support entered
| preview in early 2017 but didn't actually ship until late
| 2021...
| fulafel wrote:
| And last I heard still has show-stopping performance bugs
| affecting eg Unity web target.
| modeless wrote:
| WebGL 2 took almost 5 years to come to Safari after Chrome. It
| will not take as long for WebGPU; development is active now.
|
| It is also a bit frustrating that Chrome has not enabled WebGPU
| on all platforms by default yet.
| zamadatix wrote:
| Badass on the visualization side. The multiple emitter portion
| and the end of the scroll reminded me of
| https://apenwarr.ca/beamlab/ which demonstrates beamforming
| (adjusting the phase of adjacent transmitters to focus power
| towards a specific receiver). To play with this one the "easiest"
| way to see what's going on is go to the right hand menu, unclick
| 3 so you just have 2 transmitters, click the "r" button, and then
| click or click and drag to see how the beam gets optimized (you
| can see some stats about the received power gain in the righthand
| side).
|
| While this has to be the most fun to watch demonstration I've
| seen, something like the free tier of Hamina will likely be many
| times more useful to those wanting to optimize home Wi-Fi layout
| https://www.hamina.com/planner. The downside being they force you
| to make an account whereas this one lets you use it locally with
| the power of your own browser. The upside being Hamina gives
| multiple distilled views of the simulation as focused on common
| Wi-Fi statistics + features and less focus on displaying the wave
| simulation itself.
| Peanuts99 wrote:
| Came here looking for a mention on Hamina - I use it for work
| for planning wireless installs and it's a really decent piece
| of software.
| geysersam wrote:
| Another interesting similar project: https://cemsim.com/ (I'm not
| the author)
| missblit wrote:
| Bugs:
|
| #1 if you spam the "add a new source" button you eventually get a
| JavaScript exception logged to the screen due to an array with a
| fixed max size of 128 elements overflowing.
|
| #2 this could be graphics card or driver specific (I have an AMD
| card), but scrolling just right can can break the simulation due
| the the text boxes; for example by quickly paging up and down, or
| scrolling all the way to the bottom and then wiggling the scroll
| position up and down. Once this happens the bad data propagates
| until the entire thing is filled with noise, solid black, or
| solid white. If you then scroll up to 3D mode the screen will be
| filled with a mess of polygons.
| grishka wrote:
| I did get #2 on an Apple M1, so probably not video card
| specific.
| jerbear4328 wrote:
| Reproduced here on NVIDIA as well.
| leowbattle wrote:
| I find the #2 issue happens more easily with a higher
| simulation speed too.
| dtgriscom wrote:
| > For example, as you scroll you'll notice that the waves are
| refracting around these text boxes.
|
| Now, that's useless AND badass.
| jasmcole wrote:
| Definitely the vibe I'm going for!
| seanp2k2 wrote:
| Cool visualization but it focuses so much on the
| ``'-.,_,.-'`waves`'-.,_,.='`` and not on the actual coverage
| pattern of 6-12.5cm waves, so not as actually useful for showing
| coverage as other tools, but fun as an art project.
|
| And of course, I can't mention that without shouting out projectM
| (open-source Milkdrop) that supports WebGL
| https://github.com/projectM-visualizer/projectm/blob/master/...
| and one of the OGs, Geisswerks https://www.geisswerks.com/
|
| If you like that, you might also love NestDrop for music
| visualization tailored for VJs and with special features to
| support projecting inside domed surfaces
| https://nestimmersion.ca/nestdrop.php
| jasmcole wrote:
| Hey, if you click through to one of the example simulations
| you'll be able to change the visualization from waves to time-
| averaged power density, which should be closer to what you're
| looking for.
| Scryptonite wrote:
| When I run the Waveguide Simulator demo on my Alienware M15 Ryzen
| Ed. R5 (has a RTX 3070; Windows 11 Pro, Chrome v129), I hear a
| distinct high pitched flutter noise emanating from my laptop. I
| thought it was from the speakers, but no, with my volume down it
| was still present as long as the simulator was playing. Weird,
| but very cool demo (probably my hardware, never hear this during
| games or other WebGPU demos). The realistic house simulation
| yields a different signature in the sound.
| Tiberium wrote:
| That sounds like coil whine, it's a common thing to hear when
| GPU is working at full capacity.
|
| https://en.wikipedia.org/wiki/Electromagnetically_induced_ac...
| jasmcole wrote:
| Interesting! I have a desktop 3070 and hear the same. I don't
| hear anything on a Mac M1 though.
| eyegor wrote:
| Coil whine (or capacitor whine) from the gpu running at too
| high a refresh rate. Easiest thing would be to use nvidia
| control panel to add an fps cap to something like 2x your
| monitors max rate for the browser (or globally). It's pretty
| common with any workload after like 600 fps.
| userbinator wrote:
| As others have said, it's probably the GPU power supply
| circuits making the sound; if the pattern of power consumption
| has frequencies in the audible range, it can cause components
| like inductors and capacitors to mechanically vibrate at those
| frequencies and emit sound. The reason you don't hear it in
| games is either due to the game audio being much louder or the
| power pattern not having those audible frequencies.
|
| CPU power circuitry can do the same, but given this is using
| the GPU, it's a safe assumption that it's the latter.
| mypalmike wrote:
| I get the same coil whine on my laptop (AMD Radeon Mobile GPU)
| whenever I run GPU heavy code.
| crazygringo wrote:
| This is _exceptionally_ cool.
|
| A while ago I was trying to find realistic examples of what WiFi
| "looks like", to try to get an intuitive sense of how it operated
| in a house or outside a building -- to what extent it spreads in
| the same way as a normal lightbulb, or to what extent its vastly
| larger wavelength complicated the picture.
|
| At the time, literally the only visualization I was able to find
| was this artistic seemingly nonsense:
|
| https://inspirationist.net/what-wifi-looks-like/
|
| So I'm very happy to see this tool. I'd be even more curious to
| see a non-animated version that lets you drag your router around
| and see "illumination" of the overall signal to see how it
| changes, continuing to take into account how reflections confuse
| and degrade the usable signal, etc. Instead of the animation of
| slow wave propagation. Maybe that exists somewhere?
| jasmcole wrote:
| Thanks! If you navigate to one of the example simulations,
| you'll be able to change the instantaneous field visualisation
| to one of time-averaged power density, which sounds closer to
| what you're looking for.
|
| The cool thing about the speed of WebGPU is that you can drag
| things around and watch changes in real-time, even if you have
| to average lots of simulation steps per rendered frame.
| crazygringo wrote:
| Ah yes, I've found it -- changing "Signal" from "EM field" to
| "Power". That is _fascinating_ to look at.
|
| Is there a way to move the router around to see how the field
| changes in response?
|
| As far as I can tell you can do that in the paid version, and
| I totally understand gating that for people modeling their
| own home/office layout. But it would be pretty cool as a free
| educational demo if you could move the router in the
| otherwise fixed example.
| zokier wrote:
| cnlohr did project that visualized wifi power level spatially
|
| https://www.youtube.com/watch?v=aqqEYz38ens
| richbradshaw wrote:
| I have a Wifi 6E router, so I wonder if 6GHz vs 5 vs 2.4 acts
| noticeabley differently here? Is the overall shape the same or
| does the frequency make a big difference?
| vlovich123 wrote:
| 6 vs 5 is basically the same. 5 vs 2.4 should be quite a bit
| difference since absorption and reflection works differently.
| crtified wrote:
| What are the system requirements to run this? Fairly 'standard'
| Linux system running Chrome here.
|
| "Sorry, there was an error starting the simulation
|
| Sorry, WebGPU is not supported on our device
|
| WiFi Solver may not be compatible with your device."
| cloogshicer wrote:
| No Linux support for WebGPU in Chrome yet:
| https://caniuse.com/webgpu
| jeroenhd wrote:
| Dev tools gave me this link:
| https://github.com/gpuweb/gpuweb/wiki/Implementation-Status#...
|
| Barely any Firefox support either.
|
| Looks like I'll skip this one.
| throwaway0665 wrote:
| To run on Chromium Linux you need to enable "enable-unsafe-
| webgpu" as well as "enable-vulkan" flags in "chrome://flags".
| Best to disable again afterwards.
| kiwijamo wrote:
| Doesn't work on Firefox/Windows either.
| taminka wrote:
| hasn't webgpu standard been out for a while now? how come only
| chromium supports it?
| heftig wrote:
| Because it's an incredibly complex mess that will allow
| sandbox escape if it isn't implemented exactly right.
|
| Also, it's still in draft status. Not that that means much.
| ddtaylor wrote:
| Seems Firefox on Linux isn't supported. I'll give this a look
| another time.
| bhouston wrote:
| WeBGPU support is increasing but it isn't yet above 70% of
| devices: https://web3dsurvey.com/webgpu
| jondwillis wrote:
| went up by at least 1 device today, as I realized that I forgot
| to enable WebGPU preview in Safari on my work laptop!
| rubatuga wrote:
| Similar concept in shadertoy:
|
| https://www.shadertoy.com/view/st3XWX
| KingOfCoders wrote:
| "Sorry, WebGPU is not supported on your device" Firefox, Nvidia
|
| A. Why?
|
| B. What a bad error message
| butz wrote:
| Not to mention one cannot copy error message easily. Well, I'll
| be on itch.io playing 3D games using WebGPU on my not supported
| device.
| KingOfCoders wrote:
| Dito.
| kristiandupont wrote:
| I once wanted to make something similar, for sound. I wanted to
| create active noise cancelling "in the room", instead of via
| headphones. I pictured these devices combining a microphone and a
| speaker that you could set up in strategic location. After
| thinking about it for a bit, I realized that inference would
| cause areas with silence and others where the sound volume would
| be doubled. Less than ideal but still possibly interesting. But
| then I thought about it some more and realized that I needed to
| think in 3D, which makes the setup orders of magnitude more
| complex.
|
| It seems like that would apply here as well, at least when
| looking at the effects of refraction?
| eurekin wrote:
| If that technically worked, I could see that being a next
| unicorn.
| ahmetrcagil wrote:
| It can work (Look up beamforming). However it takes a 3d
| array of speakers with a lot of elements positioned in
| specific points in space, as well as very accurate position
| tracking for both ears. Very very unlikely to ever beat a
| high end noise cancelling headphone in terms of performance
| as well.
|
| If the listener can be fixed in space then the problem gets
| easier but in that case what you have is actually a very
| large, room sized headphone that you enter and sit down into.
|
| Source: I indirectly consulted a high-end furniture company
| on this exact project, they decided to pivot after a while.
| withinboredom wrote:
| If you had a "sound laser", you could control the waves when
| entering a column (think a "sound umbrella") to cancel out
| sounds that enter. However, this only works for "regular
| sounds" (as in non-directional sound, like sound from distant
| sources, like speakers). So, it wouldn't cancel out things like
| people speaking. It would be pretty useful for clubs, where at
| your table you can have regular speaking conversations.
|
| I hate to mention that this is all currently patented. It's
| pretty "easy" to build though, but you'll have to wait a bit
| for all the related patents to expire or pay some licensing
| fees.
| faragon wrote:
| I was expecting here SDR radio processing: noise read from GPIO's
| passed to a web browser with a pipe, showing activity on all
| channels at once.
| timkq wrote:
| I wonder if there is something like this but open-source, so I
| could customize this. I'm looking for a tool to solve UWB
| positioning (for indoor navigation) - to be able to know where to
| optimally place various UWB anchor points.
| relaxing wrote:
| Pay for a FEKO license?
| maho wrote:
| I need this, but for heatpump noise.
|
| It's mostly broadband noise that can be simulated by simpler
| methods, but visualizing possible resonance patterns for the low-
| frequency emissions from the compressor (which typically runs at
| 20Hz, 40Hz, ..., 120 Hz) would be good to know.
|
| Although I am not sure how the 2d simulation result carries over
| to the 3d world...
| croon wrote:
| I think I clicked the link at the bottom to add new sources to
| the simulation a few times too many:
|
| Unexpected Application Error!
|
| offset is out of bounds
|
| RangeError: offset is out of bounds at Float32Array.set
| (<anonymous>) at Pi.makeUniformBuffer (https://wifi-
| solver.com/dist/bundle-UKQ5A5W6.js:32:118833) at
| Pi.updateUniforms (https://wifi-solver.com/dist/bundle-
| UKQ5A5W6.js:32:117585) at Pi.setState (https://wifi-
| solver.com/dist/bundle-UKQ5A5W6.js:32:114537) at https://wifi-
| solver.com/dist/bundle-UKQ5A5W6.js:70:2373 at Vc (https://wifi-
| solver.com/dist/bundle-UKQ5A5W6.js:8:24370) at la (https://wifi-
| solver.com/dist/bundle-UKQ5A5W6.js:8:42602) at aS (https://wifi-
| solver.com/dist/bundle-UKQ5A5W6.js:8:41415) at ro (https://wifi-
| solver.com/dist/bundle-UKQ5A5W6.js:8:40441) at im (https://wifi-
| solver.com/dist/bundle-UKQ5A5W6.js:8:37031)
| whalesalad wrote:
| Won't run for me on Firefox or Chromium on Debian 12.
| a1o wrote:
| It doesn't run for me either on Safari :/
___________________________________________________________________
(page generated 2024-10-21 23:01 UTC)