Compare Pastes
Differences between the pastes
#162878 (31.01.2021 14:42)
and
#276991 (27.08.2024 23:38).
| 1 | import std.stdio; | |
| 2 | ||
| 3 | extern(C) __gshared string[] rt_options = | |
| 4 | [ "gcopt=minPoolSize:2K maxPoolSize:1M incPoolSize:4K" ]; | |
| 5 | ||
| 6 | auto fastAbs(float x) @system | |
| 7 | {
| |
| 8 | uint p = *(cast(uint*) &x); | |
| 9 | p &=0x7fffffff; | |
| 10 | return *(cast(float*) &p); | |
| 11 | } | |
| 12 | ||
| 13 | auto renormalize(Range)(Range r) | |
| 14 | {
| |
| 15 | import std.algorithm; | |
| 16 | ||
| 17 | auto maximalAbsoluteValue = r | |
| 18 | .map!(a => fastAbs(a)) | |
| 19 | .fold!max; | |
| 20 | return r | |
| 21 | .map!(a => a / maximalAbsoluteValue); | |
| 22 | } | |
| 23 | ||
| 24 | void main() | |
| 25 | {
| |
| 26 | import std.algorithm; | |
| 27 | import std.complex; | |
| 28 | import std.math; | |
| 29 | import std.numeric; | |
| 30 | import std.random; | |
| 31 | import std.range; | |
| 32 | ||
| 33 | import ppmformats; | |
| 34 | ||
| 35 | auto rng = Random(unpredictableSeed); | |
| 36 | ||
| 37 | auto signalWithNoise(float x) | |
| 38 | {
| |
| 39 | return (3.3 * sin(2*x)) + uniform(-0.3, 0.3, rng); | |
| 40 | } | |
| 41 | ||
| 42 | alias squareWave = delegate(float x) {
| |
| 43 | return | |
| 44 | ((4 * 10) / (PI)) * (sin(x) + (sin(3 * x) / (3 * x)) + (sin(5 * x) /(5 * x)) + (sin(7 * x) / (7 * x)) + (sin(9 * x) / (9 * x)) + (sin(11 * x) / (11 * x))) + (sin(13 * x) / (13 * x)) + (sin(15 * x) / (15 * x)) + (sin(17 * x) / (17 * x)); | |
| 45 | }; | |
| 46 | ||
| 47 | auto signal = iota(0, 2_048) | |
| 48 | .map!squareWave; | |
| 49 | ||
| 50 | auto normalizedFFT(Range)(Range r) | |
| 51 | {
| |
| 52 | return | |
| 53 | r | |
| 54 | .fft | |
| 55 | .map!(a => 20.0f * log10(abs(a ^^ 2))) | |
| 56 | .renormalize; | |
| 57 | } | |
| 58 | ||
| 59 | auto pd = signal | |
| 60 | .slide(1_024) | |
| 61 | .map!(a => normalizedFFT(a)); | |
| 62 | ||
| 63 | auto img = new P6Image(1024, 1024); | |
| 64 | ||
| 65 | foreach (i, e; pd.enumerate) | |
| 66 | {
| |
| 67 | foreach (j, s; e.enumerate) | |
| 68 | {
| |
| 69 | img[i, j] = new RGBColor( | |
| 70 | cast(int) (0.8 * 255.0 * abs(s)), | |
| 71 | 0, | |
| 72 | 255 - cast(int) (255 * abs(s)) | |
| 73 | ); | |
| 74 | } | |
| 75 | } | |
| 76 | img.save(`fft.ppm`); | |
| 77 | } |
