Initial commit
This commit is contained in:
		
						commit
						58ee87a861
					
				
							
								
								
									
										2
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@ -0,0 +1,2 @@
 | 
			
		||||
/.idea/
 | 
			
		||||
/vendor/
 | 
			
		||||
							
								
								
									
										35
									
								
								bin/app.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										35
									
								
								bin/app.php
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,35 @@
 | 
			
		||||
<?php
 | 
			
		||||
 | 
			
		||||
// http://enjoythemusic.com/diy/0311/crossover.htm
 | 
			
		||||
 | 
			
		||||
use Scientific\Frequency;
 | 
			
		||||
use Scientific\Impedance;
 | 
			
		||||
 | 
			
		||||
require_once __DIR__ . '/../vendor/autoload.php';
 | 
			
		||||
 | 
			
		||||
$frequency = new Frequency(unit(9000));
 | 
			
		||||
$tweeter = new Driver(new Impedance(unit(8)));
 | 
			
		||||
$woofer = new Driver(new Impedance(unit(4)));
 | 
			
		||||
 | 
			
		||||
$crossover = new FirstOrderTwoWayCrossover($frequency);
 | 
			
		||||
$capacitor = $crossover->getTweeterCapacitor($tweeter);
 | 
			
		||||
$inductor = $crossover->getWooferInductor($woofer);
 | 
			
		||||
 | 
			
		||||
printf(
 | 
			
		||||
    'First order 2-way crossover @ %s (slope = %s):%s',
 | 
			
		||||
    $crossover->getFrequency(),
 | 
			
		||||
    $crossover->getSlope(),
 | 
			
		||||
    PHP_EOL
 | 
			
		||||
);
 | 
			
		||||
printf(
 | 
			
		||||
    ' - %s capacitor in series with %s tweeter%s',
 | 
			
		||||
    $capacitor->getCapacitance(),
 | 
			
		||||
    $tweeter->getImpedance(),
 | 
			
		||||
    PHP_EOL
 | 
			
		||||
);
 | 
			
		||||
printf(
 | 
			
		||||
    ' - %s inductor in series with %s woofer%s',
 | 
			
		||||
    $inductor->getInductance()->format('milli'),
 | 
			
		||||
    $woofer->getImpedance(),
 | 
			
		||||
    PHP_EOL
 | 
			
		||||
);
 | 
			
		||||
							
								
								
									
										13
									
								
								composer.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								composer.json
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,13 @@
 | 
			
		||||
{
 | 
			
		||||
    "name": "joopschilder/speaker-params",
 | 
			
		||||
    "description": "Speaker parameter modelling program",
 | 
			
		||||
    "autoload": {
 | 
			
		||||
        "files": ["src/Lib/helpers.php"],
 | 
			
		||||
        "psr-0": {
 | 
			
		||||
            "": ["src"]
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
    "require-dev": {
 | 
			
		||||
        "symfony/var-dumper": "^5.2"
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										270
									
								
								composer.lock
									
									
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						
									
										270
									
								
								composer.lock
									
									
									
										generated
									
									
									
										Normal file
									
								
							@ -0,0 +1,270 @@
 | 
			
		||||
{
 | 
			
		||||
    "_readme": [
 | 
			
		||||
        "This file locks the dependencies of your project to a known state",
 | 
			
		||||
        "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
 | 
			
		||||
        "This file is @generated automatically"
 | 
			
		||||
    ],
 | 
			
		||||
    "content-hash": "997f1773a8a4495e430433bfebab7f7c",
 | 
			
		||||
    "packages": [],
 | 
			
		||||
    "packages-dev": [
 | 
			
		||||
        {
 | 
			
		||||
            "name": "symfony/polyfill-mbstring",
 | 
			
		||||
            "version": "v1.22.1",
 | 
			
		||||
            "source": {
 | 
			
		||||
                "type": "git",
 | 
			
		||||
                "url": "https://github.com/symfony/polyfill-mbstring.git",
 | 
			
		||||
                "reference": "5232de97ee3b75b0360528dae24e73db49566ab1"
 | 
			
		||||
            },
 | 
			
		||||
            "dist": {
 | 
			
		||||
                "type": "zip",
 | 
			
		||||
                "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/5232de97ee3b75b0360528dae24e73db49566ab1",
 | 
			
		||||
                "reference": "5232de97ee3b75b0360528dae24e73db49566ab1",
 | 
			
		||||
                "shasum": ""
 | 
			
		||||
            },
 | 
			
		||||
            "require": {
 | 
			
		||||
                "php": ">=7.1"
 | 
			
		||||
            },
 | 
			
		||||
            "suggest": {
 | 
			
		||||
                "ext-mbstring": "For best performance"
 | 
			
		||||
            },
 | 
			
		||||
            "type": "library",
 | 
			
		||||
            "extra": {
 | 
			
		||||
                "branch-alias": {
 | 
			
		||||
                    "dev-main": "1.22-dev"
 | 
			
		||||
                },
 | 
			
		||||
                "thanks": {
 | 
			
		||||
                    "name": "symfony/polyfill",
 | 
			
		||||
                    "url": "https://github.com/symfony/polyfill"
 | 
			
		||||
                }
 | 
			
		||||
            },
 | 
			
		||||
            "autoload": {
 | 
			
		||||
                "psr-4": {
 | 
			
		||||
                    "Symfony\\Polyfill\\Mbstring\\": ""
 | 
			
		||||
                },
 | 
			
		||||
                "files": [
 | 
			
		||||
                    "bootstrap.php"
 | 
			
		||||
                ]
 | 
			
		||||
            },
 | 
			
		||||
            "notification-url": "https://packagist.org/downloads/",
 | 
			
		||||
            "license": [
 | 
			
		||||
                "MIT"
 | 
			
		||||
            ],
 | 
			
		||||
            "authors": [
 | 
			
		||||
                {
 | 
			
		||||
                    "name": "Nicolas Grekas",
 | 
			
		||||
                    "email": "p@tchwork.com"
 | 
			
		||||
                },
 | 
			
		||||
                {
 | 
			
		||||
                    "name": "Symfony Community",
 | 
			
		||||
                    "homepage": "https://symfony.com/contributors"
 | 
			
		||||
                }
 | 
			
		||||
            ],
 | 
			
		||||
            "description": "Symfony polyfill for the Mbstring extension",
 | 
			
		||||
            "homepage": "https://symfony.com",
 | 
			
		||||
            "keywords": [
 | 
			
		||||
                "compatibility",
 | 
			
		||||
                "mbstring",
 | 
			
		||||
                "polyfill",
 | 
			
		||||
                "portable",
 | 
			
		||||
                "shim"
 | 
			
		||||
            ],
 | 
			
		||||
            "support": {
 | 
			
		||||
                "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.22.1"
 | 
			
		||||
            },
 | 
			
		||||
            "funding": [
 | 
			
		||||
                {
 | 
			
		||||
                    "url": "https://symfony.com/sponsor",
 | 
			
		||||
                    "type": "custom"
 | 
			
		||||
                },
 | 
			
		||||
                {
 | 
			
		||||
                    "url": "https://github.com/fabpot",
 | 
			
		||||
                    "type": "github"
 | 
			
		||||
                },
 | 
			
		||||
                {
 | 
			
		||||
                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
 | 
			
		||||
                    "type": "tidelift"
 | 
			
		||||
                }
 | 
			
		||||
            ],
 | 
			
		||||
            "time": "2021-01-22T09:19:47+00:00"
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "name": "symfony/polyfill-php80",
 | 
			
		||||
            "version": "v1.22.1",
 | 
			
		||||
            "source": {
 | 
			
		||||
                "type": "git",
 | 
			
		||||
                "url": "https://github.com/symfony/polyfill-php80.git",
 | 
			
		||||
                "reference": "dc3063ba22c2a1fd2f45ed856374d79114998f91"
 | 
			
		||||
            },
 | 
			
		||||
            "dist": {
 | 
			
		||||
                "type": "zip",
 | 
			
		||||
                "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/dc3063ba22c2a1fd2f45ed856374d79114998f91",
 | 
			
		||||
                "reference": "dc3063ba22c2a1fd2f45ed856374d79114998f91",
 | 
			
		||||
                "shasum": ""
 | 
			
		||||
            },
 | 
			
		||||
            "require": {
 | 
			
		||||
                "php": ">=7.1"
 | 
			
		||||
            },
 | 
			
		||||
            "type": "library",
 | 
			
		||||
            "extra": {
 | 
			
		||||
                "branch-alias": {
 | 
			
		||||
                    "dev-main": "1.22-dev"
 | 
			
		||||
                },
 | 
			
		||||
                "thanks": {
 | 
			
		||||
                    "name": "symfony/polyfill",
 | 
			
		||||
                    "url": "https://github.com/symfony/polyfill"
 | 
			
		||||
                }
 | 
			
		||||
            },
 | 
			
		||||
            "autoload": {
 | 
			
		||||
                "psr-4": {
 | 
			
		||||
                    "Symfony\\Polyfill\\Php80\\": ""
 | 
			
		||||
                },
 | 
			
		||||
                "files": [
 | 
			
		||||
                    "bootstrap.php"
 | 
			
		||||
                ],
 | 
			
		||||
                "classmap": [
 | 
			
		||||
                    "Resources/stubs"
 | 
			
		||||
                ]
 | 
			
		||||
            },
 | 
			
		||||
            "notification-url": "https://packagist.org/downloads/",
 | 
			
		||||
            "license": [
 | 
			
		||||
                "MIT"
 | 
			
		||||
            ],
 | 
			
		||||
            "authors": [
 | 
			
		||||
                {
 | 
			
		||||
                    "name": "Ion Bazan",
 | 
			
		||||
                    "email": "ion.bazan@gmail.com"
 | 
			
		||||
                },
 | 
			
		||||
                {
 | 
			
		||||
                    "name": "Nicolas Grekas",
 | 
			
		||||
                    "email": "p@tchwork.com"
 | 
			
		||||
                },
 | 
			
		||||
                {
 | 
			
		||||
                    "name": "Symfony Community",
 | 
			
		||||
                    "homepage": "https://symfony.com/contributors"
 | 
			
		||||
                }
 | 
			
		||||
            ],
 | 
			
		||||
            "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions",
 | 
			
		||||
            "homepage": "https://symfony.com",
 | 
			
		||||
            "keywords": [
 | 
			
		||||
                "compatibility",
 | 
			
		||||
                "polyfill",
 | 
			
		||||
                "portable",
 | 
			
		||||
                "shim"
 | 
			
		||||
            ],
 | 
			
		||||
            "support": {
 | 
			
		||||
                "source": "https://github.com/symfony/polyfill-php80/tree/v1.22.1"
 | 
			
		||||
            },
 | 
			
		||||
            "funding": [
 | 
			
		||||
                {
 | 
			
		||||
                    "url": "https://symfony.com/sponsor",
 | 
			
		||||
                    "type": "custom"
 | 
			
		||||
                },
 | 
			
		||||
                {
 | 
			
		||||
                    "url": "https://github.com/fabpot",
 | 
			
		||||
                    "type": "github"
 | 
			
		||||
                },
 | 
			
		||||
                {
 | 
			
		||||
                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
 | 
			
		||||
                    "type": "tidelift"
 | 
			
		||||
                }
 | 
			
		||||
            ],
 | 
			
		||||
            "time": "2021-01-07T16:49:33+00:00"
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "name": "symfony/var-dumper",
 | 
			
		||||
            "version": "v5.2.6",
 | 
			
		||||
            "source": {
 | 
			
		||||
                "type": "git",
 | 
			
		||||
                "url": "https://github.com/symfony/var-dumper.git",
 | 
			
		||||
                "reference": "89412a68ea2e675b4e44f260a5666729f77f668e"
 | 
			
		||||
            },
 | 
			
		||||
            "dist": {
 | 
			
		||||
                "type": "zip",
 | 
			
		||||
                "url": "https://api.github.com/repos/symfony/var-dumper/zipball/89412a68ea2e675b4e44f260a5666729f77f668e",
 | 
			
		||||
                "reference": "89412a68ea2e675b4e44f260a5666729f77f668e",
 | 
			
		||||
                "shasum": ""
 | 
			
		||||
            },
 | 
			
		||||
            "require": {
 | 
			
		||||
                "php": ">=7.2.5",
 | 
			
		||||
                "symfony/polyfill-mbstring": "~1.0",
 | 
			
		||||
                "symfony/polyfill-php80": "^1.15"
 | 
			
		||||
            },
 | 
			
		||||
            "conflict": {
 | 
			
		||||
                "phpunit/phpunit": "<5.4.3",
 | 
			
		||||
                "symfony/console": "<4.4"
 | 
			
		||||
            },
 | 
			
		||||
            "require-dev": {
 | 
			
		||||
                "ext-iconv": "*",
 | 
			
		||||
                "symfony/console": "^4.4|^5.0",
 | 
			
		||||
                "symfony/process": "^4.4|^5.0",
 | 
			
		||||
                "twig/twig": "^2.13|^3.0.4"
 | 
			
		||||
            },
 | 
			
		||||
            "suggest": {
 | 
			
		||||
                "ext-iconv": "To convert non-UTF-8 strings to UTF-8 (or symfony/polyfill-iconv in case ext-iconv cannot be used).",
 | 
			
		||||
                "ext-intl": "To show region name in time zone dump",
 | 
			
		||||
                "symfony/console": "To use the ServerDumpCommand and/or the bin/var-dump-server script"
 | 
			
		||||
            },
 | 
			
		||||
            "bin": [
 | 
			
		||||
                "Resources/bin/var-dump-server"
 | 
			
		||||
            ],
 | 
			
		||||
            "type": "library",
 | 
			
		||||
            "autoload": {
 | 
			
		||||
                "files": [
 | 
			
		||||
                    "Resources/functions/dump.php"
 | 
			
		||||
                ],
 | 
			
		||||
                "psr-4": {
 | 
			
		||||
                    "Symfony\\Component\\VarDumper\\": ""
 | 
			
		||||
                },
 | 
			
		||||
                "exclude-from-classmap": [
 | 
			
		||||
                    "/Tests/"
 | 
			
		||||
                ]
 | 
			
		||||
            },
 | 
			
		||||
            "notification-url": "https://packagist.org/downloads/",
 | 
			
		||||
            "license": [
 | 
			
		||||
                "MIT"
 | 
			
		||||
            ],
 | 
			
		||||
            "authors": [
 | 
			
		||||
                {
 | 
			
		||||
                    "name": "Nicolas Grekas",
 | 
			
		||||
                    "email": "p@tchwork.com"
 | 
			
		||||
                },
 | 
			
		||||
                {
 | 
			
		||||
                    "name": "Symfony Community",
 | 
			
		||||
                    "homepage": "https://symfony.com/contributors"
 | 
			
		||||
                }
 | 
			
		||||
            ],
 | 
			
		||||
            "description": "Provides mechanisms for walking through any arbitrary PHP variable",
 | 
			
		||||
            "homepage": "https://symfony.com",
 | 
			
		||||
            "keywords": [
 | 
			
		||||
                "debug",
 | 
			
		||||
                "dump"
 | 
			
		||||
            ],
 | 
			
		||||
            "support": {
 | 
			
		||||
                "source": "https://github.com/symfony/var-dumper/tree/v5.2.6"
 | 
			
		||||
            },
 | 
			
		||||
            "funding": [
 | 
			
		||||
                {
 | 
			
		||||
                    "url": "https://symfony.com/sponsor",
 | 
			
		||||
                    "type": "custom"
 | 
			
		||||
                },
 | 
			
		||||
                {
 | 
			
		||||
                    "url": "https://github.com/fabpot",
 | 
			
		||||
                    "type": "github"
 | 
			
		||||
                },
 | 
			
		||||
                {
 | 
			
		||||
                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
 | 
			
		||||
                    "type": "tidelift"
 | 
			
		||||
                }
 | 
			
		||||
            ],
 | 
			
		||||
            "time": "2021-03-28T09:42:18+00:00"
 | 
			
		||||
        }
 | 
			
		||||
    ],
 | 
			
		||||
    "aliases": [],
 | 
			
		||||
    "minimum-stability": "stable",
 | 
			
		||||
    "stability-flags": [],
 | 
			
		||||
    "prefer-stable": false,
 | 
			
		||||
    "prefer-lowest": false,
 | 
			
		||||
    "platform": [],
 | 
			
		||||
    "platform-dev": [],
 | 
			
		||||
    "plugin-api-version": "2.0.0"
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										19
									
								
								src/Components/Capacitor.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								src/Components/Capacitor.php
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,19 @@
 | 
			
		||||
<?php
 | 
			
		||||
 | 
			
		||||
namespace Components;
 | 
			
		||||
 | 
			
		||||
use Scientific\Capacitance;
 | 
			
		||||
 | 
			
		||||
class Capacitor
 | 
			
		||||
{
 | 
			
		||||
    public function __construct(
 | 
			
		||||
        private float $capacitance
 | 
			
		||||
    )
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function getCapacitance(): Capacitance
 | 
			
		||||
    {
 | 
			
		||||
        return Capacitance::fromValue($this->capacitance);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										19
									
								
								src/Components/Inductor.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								src/Components/Inductor.php
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,19 @@
 | 
			
		||||
<?php
 | 
			
		||||
 | 
			
		||||
namespace Components;
 | 
			
		||||
 | 
			
		||||
use Scientific\Inductance;
 | 
			
		||||
 | 
			
		||||
class Inductor
 | 
			
		||||
{
 | 
			
		||||
    public function __construct(
 | 
			
		||||
        private float $inductance
 | 
			
		||||
    )
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function getInductance(): Inductance
 | 
			
		||||
    {
 | 
			
		||||
        return Inductance::fromValue($this->inductance);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										17
									
								
								src/Driver.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								src/Driver.php
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,17 @@
 | 
			
		||||
<?php
 | 
			
		||||
 | 
			
		||||
use Scientific\Impedance;
 | 
			
		||||
 | 
			
		||||
class Driver
 | 
			
		||||
{
 | 
			
		||||
    public function __construct(
 | 
			
		||||
        private Impedance $impedance
 | 
			
		||||
    )
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function getImpedance(): Impedance
 | 
			
		||||
    {
 | 
			
		||||
        return clone $this->impedance;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										44
									
								
								src/FirstOrderTwoWayCrossover.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										44
									
								
								src/FirstOrderTwoWayCrossover.php
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,44 @@
 | 
			
		||||
<?php
 | 
			
		||||
 | 
			
		||||
use Components\Capacitor;
 | 
			
		||||
use Components\Inductor;
 | 
			
		||||
use Scientific\CrossoverSlope;
 | 
			
		||||
use Scientific\Frequency;
 | 
			
		||||
 | 
			
		||||
class FirstOrderTwoWayCrossover
 | 
			
		||||
{
 | 
			
		||||
    private const PI = 3.1415926535;
 | 
			
		||||
    private const TWO_PI = 2. * self::PI;
 | 
			
		||||
 | 
			
		||||
    public function __construct(
 | 
			
		||||
        private Frequency $frequency
 | 
			
		||||
    )
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function getFrequency(): Frequency
 | 
			
		||||
    {
 | 
			
		||||
        return clone $this->frequency;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function getSlope(): CrossoverSlope
 | 
			
		||||
    {
 | 
			
		||||
        return CrossoverSlope::fromDecibelPerOctave(6.);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function getTweeterCapacitor(Driver $driver): Capacitor
 | 
			
		||||
    {
 | 
			
		||||
        $f = $this->getFrequency()->getValue()->unit();
 | 
			
		||||
        $z = $driver->getImpedance()->getValue()->unit();
 | 
			
		||||
 | 
			
		||||
        return new Capacitor(1. / (self::TWO_PI * $f * $z));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function getWooferInductor(Driver $driver): Inductor
 | 
			
		||||
    {
 | 
			
		||||
        $f = $this->getFrequency()->getValue()->unit();
 | 
			
		||||
        $z = $driver->getImpedance()->getValue()->unit();
 | 
			
		||||
 | 
			
		||||
        return new Inductor($z / (self::TWO_PI * $f));
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										10
									
								
								src/Lib/helpers.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								src/Lib/helpers.php
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,10 @@
 | 
			
		||||
<?php
 | 
			
		||||
 | 
			
		||||
use Scientific\Unit;
 | 
			
		||||
 | 
			
		||||
if (!function_exists('unit')) {
 | 
			
		||||
    function unit(float $value): Unit
 | 
			
		||||
    {
 | 
			
		||||
        return new Unit($value);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										16
									
								
								src/Scientific/Capacitance.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								src/Scientific/Capacitance.php
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,16 @@
 | 
			
		||||
<?php
 | 
			
		||||
 | 
			
		||||
namespace Scientific;
 | 
			
		||||
 | 
			
		||||
class Capacitance extends Quantity
 | 
			
		||||
{
 | 
			
		||||
    protected function getSymbol(): string
 | 
			
		||||
    {
 | 
			
		||||
        return 'F';
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    protected function getName(): string
 | 
			
		||||
    {
 | 
			
		||||
        return 'farad';
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										26
									
								
								src/Scientific/CrossoverSlope.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								src/Scientific/CrossoverSlope.php
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,26 @@
 | 
			
		||||
<?php
 | 
			
		||||
 | 
			
		||||
namespace Scientific;
 | 
			
		||||
 | 
			
		||||
class CrossoverSlope extends Quantity
 | 
			
		||||
{
 | 
			
		||||
    public static function fromDecibelPerOctave(float $dbPerOctave): static
 | 
			
		||||
    {
 | 
			
		||||
        return static::fromValue($dbPerOctave / 10.);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    protected function getSymbol(): string
 | 
			
		||||
    {
 | 
			
		||||
        return 'B/Oct';
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    protected function getName(): string
 | 
			
		||||
    {
 | 
			
		||||
        return 'slope';
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function __toString(): string
 | 
			
		||||
    {
 | 
			
		||||
        return $this->format('deci');
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										16
									
								
								src/Scientific/Frequency.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								src/Scientific/Frequency.php
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,16 @@
 | 
			
		||||
<?php
 | 
			
		||||
 | 
			
		||||
namespace Scientific;
 | 
			
		||||
 | 
			
		||||
class Frequency extends Quantity
 | 
			
		||||
{
 | 
			
		||||
    protected function getSymbol(): string
 | 
			
		||||
    {
 | 
			
		||||
        return 'Hz';
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    protected function getName(): string
 | 
			
		||||
    {
 | 
			
		||||
        return 'hertz';
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										7
									
								
								src/Scientific/Impedance.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								src/Scientific/Impedance.php
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,7 @@
 | 
			
		||||
<?php
 | 
			
		||||
 | 
			
		||||
namespace Scientific;
 | 
			
		||||
 | 
			
		||||
class Impedance extends Resistance
 | 
			
		||||
{
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										16
									
								
								src/Scientific/Inductance.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								src/Scientific/Inductance.php
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,16 @@
 | 
			
		||||
<?php
 | 
			
		||||
 | 
			
		||||
namespace Scientific;
 | 
			
		||||
 | 
			
		||||
class Inductance extends Quantity
 | 
			
		||||
{
 | 
			
		||||
    protected function getSymbol(): string
 | 
			
		||||
    {
 | 
			
		||||
        return 'H';
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    protected function getName(): string
 | 
			
		||||
    {
 | 
			
		||||
        return 'henry';
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										86
									
								
								src/Scientific/Quantity.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										86
									
								
								src/Scientific/Quantity.php
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,86 @@
 | 
			
		||||
<?php
 | 
			
		||||
 | 
			
		||||
namespace Scientific;
 | 
			
		||||
 | 
			
		||||
use InvalidArgumentException;
 | 
			
		||||
 | 
			
		||||
abstract class Quantity
 | 
			
		||||
{
 | 
			
		||||
    /*
 | 
			
		||||
     * https://en.wikipedia.org/wiki/Metric_prefix
 | 
			
		||||
     */
 | 
			
		||||
    private const METRIC_PREFIXES = [
 | 
			
		||||
        'yotta' => 'Y',
 | 
			
		||||
        'zetta' => 'Z',
 | 
			
		||||
        'exa'   => 'E',
 | 
			
		||||
        'peta'  => 'P',
 | 
			
		||||
        'tera'  => 'T',
 | 
			
		||||
        'giga'  => 'G',
 | 
			
		||||
        'mega'  => 'M',
 | 
			
		||||
        'kilo'  => 'k',
 | 
			
		||||
        'hecto' => 'h',
 | 
			
		||||
        'deca'  => 'da',
 | 
			
		||||
        'unit'  => '',
 | 
			
		||||
        'deci'  => 'd',
 | 
			
		||||
        'centi' => 'c',
 | 
			
		||||
        'milli' => 'm',
 | 
			
		||||
        'micro' => 'μ',
 | 
			
		||||
        'nano'  => 'n',
 | 
			
		||||
        'pico'  => 'p',
 | 
			
		||||
        'femto' => 'f',
 | 
			
		||||
        'atto'  => 'a',
 | 
			
		||||
        'zepto' => 'z',
 | 
			
		||||
        'yocto' => 'y',
 | 
			
		||||
    ];
 | 
			
		||||
 | 
			
		||||
    abstract protected function getSymbol(): string;
 | 
			
		||||
 | 
			
		||||
    abstract protected function getName(): string;
 | 
			
		||||
 | 
			
		||||
    public function __construct(
 | 
			
		||||
        private Unit $value
 | 
			
		||||
    )
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    final public static function fromValue(float $value): static
 | 
			
		||||
    {
 | 
			
		||||
        return new static(new Unit($value));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    final public function getValue(): Unit
 | 
			
		||||
    {
 | 
			
		||||
        return $this->value;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    final public function format(string $prefix = 'auto'): string
 | 
			
		||||
    {
 | 
			
		||||
        if ($prefix === 'auto') {
 | 
			
		||||
            $prefix = $this->getAppropriatePrefix();
 | 
			
		||||
        } else if (!method_exists($this->value, $prefix)) {
 | 
			
		||||
            throw new InvalidArgumentException('Invalid size: ' . $prefix);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        $value = $this->value->{$prefix}();
 | 
			
		||||
        $prefix = self::METRIC_PREFIXES[$prefix] ?? '?';
 | 
			
		||||
        $symbol = $this->getSymbol();
 | 
			
		||||
 | 
			
		||||
        return sprintf('%.3g %s%s', $value, $prefix, $symbol);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private function getAppropriatePrefix(): string
 | 
			
		||||
    {
 | 
			
		||||
        foreach (array_keys(self::METRIC_PREFIXES) as $prefix) {
 | 
			
		||||
            $value = $this->value->{$prefix}();
 | 
			
		||||
            if ($value >= 1. && $value < 1000.) {
 | 
			
		||||
                return $prefix;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        return 'unit';
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function __toString(): string
 | 
			
		||||
    {
 | 
			
		||||
        return $this->format();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										16
									
								
								src/Scientific/Resistance.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								src/Scientific/Resistance.php
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,16 @@
 | 
			
		||||
<?php
 | 
			
		||||
 | 
			
		||||
namespace Scientific;
 | 
			
		||||
 | 
			
		||||
class Resistance extends Quantity
 | 
			
		||||
{
 | 
			
		||||
    protected function getSymbol(): string
 | 
			
		||||
    {
 | 
			
		||||
        return 'Ω';
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    protected function getName(): string
 | 
			
		||||
    {
 | 
			
		||||
        return 'ohm';
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										117
									
								
								src/Scientific/Unit.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										117
									
								
								src/Scientific/Unit.php
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,117 @@
 | 
			
		||||
<?php
 | 
			
		||||
 | 
			
		||||
namespace Scientific;
 | 
			
		||||
 | 
			
		||||
class Unit
 | 
			
		||||
{
 | 
			
		||||
    public function __construct(
 | 
			
		||||
        private float $value
 | 
			
		||||
    )
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function yotta(): float
 | 
			
		||||
    {
 | 
			
		||||
        return $this->zetta() / 1000.;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function zetta(): float
 | 
			
		||||
    {
 | 
			
		||||
        return $this->exa() / 1000.;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function exa(): float
 | 
			
		||||
    {
 | 
			
		||||
        return $this->peta() / 1000.;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function peta(): float
 | 
			
		||||
    {
 | 
			
		||||
        return $this->tera() / 1000.;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function tera(): float
 | 
			
		||||
    {
 | 
			
		||||
        return $this->giga() / 1000.;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function giga(): float
 | 
			
		||||
    {
 | 
			
		||||
        return $this->mega() / 1000.;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function mega(): float
 | 
			
		||||
    {
 | 
			
		||||
        return $this->kilo() / 1000.;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function kilo(): float
 | 
			
		||||
    {
 | 
			
		||||
        return $this->unit() / 1000.;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function hecto(): float
 | 
			
		||||
    {
 | 
			
		||||
        return $this->unit() / 100.;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function deca(): float
 | 
			
		||||
    {
 | 
			
		||||
        return $this->unit() / 10.;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function unit(): float
 | 
			
		||||
    {
 | 
			
		||||
        return $this->value;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function deci(): float
 | 
			
		||||
    {
 | 
			
		||||
        return 10. * $this->unit();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function centi(): float
 | 
			
		||||
    {
 | 
			
		||||
        return 100. * $this->unit();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function milli(): float
 | 
			
		||||
    {
 | 
			
		||||
        return 1000. * $this->unit();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function micro(): float
 | 
			
		||||
    {
 | 
			
		||||
        return 1000. * $this->milli();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function nano(): float
 | 
			
		||||
    {
 | 
			
		||||
        return 1000. * $this->micro();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function pico(): float
 | 
			
		||||
    {
 | 
			
		||||
        return 1000. * $this->nano();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function femto(): float
 | 
			
		||||
    {
 | 
			
		||||
        return 1000. * $this->pico();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function atto(): float
 | 
			
		||||
    {
 | 
			
		||||
        return 1000. * $this->femto();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function zepto(): float
 | 
			
		||||
    {
 | 
			
		||||
        return 1000. * $this->atto();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function yocto(): float
 | 
			
		||||
    {
 | 
			
		||||
        return 1000. * $this->yocto();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user