Repository: PlasmaPy/PlasmaPy

Issue:
Fully define configuration values for sphinx-hoverxref in `docs/conf.py`
Previously we had added the [sphinx-hoverxref](https://sphinx-hoverxref.readthedocs.io/en/latest/index.html) extension, but we did not fully define the configuration variables that go into `docs/conf.py`.  The only one we defined so far was `hoverxref_auto_ref` which only affects the `:ref:` role. We still need to add in the relevant [sphinx-hoverxref configuration variables](https://sphinx-hoverxref.readthedocs.io/en/latest/configuration.html).

Discussion:
codecov[bot]: # [Codecov](https://codecov.io/gh/PlasmaPy/PlasmaPy/pull/1437?src=pr&el=h1&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=PlasmaPy) Report
> Merging [#1437](https://codecov.io/gh/PlasmaPy/PlasmaPy/pull/1437?src=pr&el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=PlasmaPy) (de84026) into [main](https://codecov.io/gh/PlasmaPy/PlasmaPy/commit/57cf37e91bd323d84b58299733891f38579865f5?el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=PlasmaPy) (57cf37e) will **not change** coverage.
> The diff coverage is `n/a`.

[![Impacted file tree graph](https://codecov.io/gh/PlasmaPy/PlasmaPy/pull/1437/graphs/tree.svg?width=650&height=150&src=pr&token=LzZ5mnXVad&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=PlasmaPy)](https://codecov.io/gh/PlasmaPy/PlasmaPy/pull/1437?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=PlasmaPy)

```diff
@@           Coverage Diff           @@
##             main    #1437   +/-   ##
=======================================
  Coverage   96.48%   96.48%           
=======================================
  Files          78       78           
  Lines        7787     7787           
=======================================
  Hits         7513     7513           
  Misses        274      274           
```



------

[Continue to review full report at Codecov](https://codecov.io/gh/PlasmaPy/PlasmaPy/pull/1437?src=pr&el=continue&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=PlasmaPy).
> **Legend** - [Click here to learn more](https://docs.codecov.io/docs/codecov-delta?utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=PlasmaPy)
> `Δ = absolute <relative> (impact)`, `ø = not affected`, `? = missing data`
> Powered by [Codecov](https://codecov.io/gh/PlasmaPy/PlasmaPy/pull/1437?src=pr&el=footer&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=PlasmaPy). Last update [57cf37e...de84026](https://codecov.io/gh/PlasmaPy/PlasmaPy/pull/1437?src=pr&el=lastupdated&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=PlasmaPy). Read the [comment docs](https://docs.codecov.io/docs/pull-request-comments?utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=PlasmaPy).

rocco8773: @namurphy I've discovered that `sphinx-hoverxref` will not generate a tooltip if you reference an external ojbect like `` `astropy.units.Quantity` ``, but will generate the tooltip if you use the correct role like `` :class:`astropy.units.Quantity` ``.  Since we predominately use the former, most external reference will not get a tooltip, and I'm not about to go do that refactoring.

I have opened an issue at `sphinx-hoverxref` to see what they say. https://github.com/readthedocs/sphinx-hoverxref/issues/170

Patch:
diff --git a/changelog/1434.feature.rst b/changelog/1434.feature.rst
index f661fad7..c582b3fe 100644
--- a/changelog/1434.feature.rst
+++ b/changelog/1434.feature.rst
@@ -2,5 +2,5 @@ Created `plasmapy.formulary.lengths` to contain length related plasma
 parameters, and migrated `~plasmapy.formulary.lengths.Debye_length`,
 `~plasmapy.formulary.lengths.gyroradius`, and
 `~plasmapy.formulary.lengths.inertial_length` from
-`plamsapy.formulary.parameters` to the new module.  Related aliases were
+`plasmapy.formulary.parameters` to the new module.  Related aliases were
 also migrated.
diff --git a/changelog/1437.doc.rst b/changelog/1437.doc.rst
new file mode 100644
index 00000000..50d88889
--- /dev/null
+++ b/changelog/1437.doc.rst
@@ -0,0 +1,1 @@
+Configured the Sphinx_ extension `sphinx-hoverxref`.
diff --git a/changelog/1439.feature.rst b/changelog/1439.feature.rst
new file mode 100644
index 00000000..4043bbb6
--- /dev/null
+++ b/changelog/1439.feature.rst
@@ -0,0 +1,9 @@
+Created `plasmapy.formulary.frequencies` to contain frequency related
+plasma parameters, and migrated
+`~plasmapy.formulary.frequencies.gyrofrequency`,
+`~plasmapy.formulary.frequencies.plasma_frequency`,
+`~plasmapy.formulary.frequencies.plasma_frequency_lite`,
+`~plasmapy.formulary.frequencies.lower_hybrid_frequency`, and
+`~plasmapy.formulary.frequencies.upper_hybrid_frequency` from
+`plasmapy.formulary.parameters` to the new module.  Related aliases were
+also migrated.
diff --git a/docs/conf.py b/docs/conf.py
index 3f4f8068..e067c210 100644
--- a/docs/conf.py
+++ b/docs/conf.py
@@ -38,8 +38,8 @@
             "PlasmaPy provides short-named (alias) versions of the most "
             "common plasma functionality.  These aliases are only given to "
             "functionality where there is a common lexicon in the community, "
-            "for example `~plasmapy.formulary.parameters.plasma_frequency` "
-            " has the alias `~plasmapy.formulary.parameters.wp_`.  All aliases "
+            "for example `~plasmapy.formulary.frequencies.plasma_frequency` "
+            " has the alias `~plasmapy.formulary.frequencies.wp_`.  All aliases "
             "in PlasmaPy are denoted with a trailing underscore ``_``."
         ),
         "dunder": "__aliases__",
@@ -107,12 +107,13 @@
 # in other packages. When mappings are removed or added, please update
 # the section in docs/doc_guide.rst on references to other packages.
 intersphinx_mapping = {
-    "python": ("https://docs.python.org/3", None),
+    "readthedocs": ("https://docs.readthedocs.io/en/stable/", None),
+    "python": ("https://docs.python.org/3/", None),
     "numpy": ("https://numpy.org/doc/stable/", None),
     "scipy": ("https://docs.scipy.org/doc/scipy/", None),
     "pandas": ("https://pandas.pydata.org/pandas-docs/stable/", None),
     "astropy": ("https://docs.astropy.org/en/stable/", None),
-    "pytest": ("https://docs.pytest.org/en/stable", None),
+    "pytest": ("https://docs.pytest.org/en/stable/", None),
     "sphinx_automodapi": (
         "https://sphinx-automodapi.readthedocs.io/en/latest/",
         None,
@@ -120,6 +121,18 @@
     "sphinx": ("https://www.sphinx-doc.org/en/master/", None),
     "numba": ("https://numba.readthedocs.io/en/stable/", None),
 }
+hoverxref_intersphinx = [
+    "readthedocs",
+    "python",
+    "numpy",
+    "scipy",
+    "pandas",
+    "astropy",
+    "pytest",
+    "sphinx_automodapi",
+    "sphinx",
+    "numba",
+]
 
 autoclass_content = "both"
 
@@ -213,7 +226,48 @@
 # Use a code highlighting style that meets the WCAG AA contrast standard
 pygments_style = "default"
 
+# adapted from sphinx-hoverxref conf.py
+if os.environ.get("READTHEDOCS"):
+    # Building on Read the Docs
+    hoverxref_api_host = "https://readthedocs.org"
+
+    if os.environ.get("PROXIED_API_ENDPOINT"):
+        # Use the proxied API endpoint
+        # - A RTD thing to avoid a CSRF block when docs are using a
+        #   custom domain
+        hoverxref_api_host = "/_"
+
+hoverxref_tooltip_maxwidth = 600  # RTD main window is 696px
 hoverxref_auto_ref = True
+hoverxref_mathjax = True
+hoverxref_sphinxtabs = True
+
+# hoverxref has to be applied to these
+hoverxref_domains = ["py", "cite"]
+hoverxref_roles = ["confval", "term"]
+
+hoverxref_role_types = {
+    # roles with cite domain
+    "p": "tooltip",
+    "t": "tooltip",
+    #
+    # roles with py domain
+    "attr": "tooltip",
+    "class": "tooltip",
+    "const": "tooltip",
+    "data": "tooltip",
+    "exc": "tooltip",
+    "func": "tooltip",
+    "meth": "tooltip",
+    "mod": "tooltip",
+    "obj": "tooltip",
+    #
+    # roles with std domain
+    "confval": "tooltip",
+    "hoverxref": "tooltip",
+    "ref": "tooltip",
+    "term": "tooltip",
+}
 
 # -- Options for HTML output ----------------------------------------------
 
diff --git a/docs/formulary/frequencies.rst b/docs/formulary/frequencies.rst
new file mode 100644
index 00000000..d0c06fd1
--- /dev/null
+++ b/docs/formulary/frequencies.rst
@@ -0,0 +1,7 @@
+.. _frequencies:
+
+**************************************************************
+Frequency Plasma Parameters (`plasmapy.formulary.frequencies`)
+**************************************************************
+
+.. automodapi:: plasmapy.formulary.frequencies
diff --git a/docs/formulary/index.rst b/docs/formulary/index.rst
index 5034b3cf..07248349 100644
--- a/docs/formulary/index.rst
+++ b/docs/formulary/index.rst
@@ -29,6 +29,9 @@ physical quantities helpful for plasma physics.
    | .. toctree:: Drifts <drifts>                           | `plasmapy.formulary.drifts`             |
    |    :maxdepth: 1                                        |                                         |
    +--------------------------------------------------------+-----------------------------------------+
+   | .. toctree:: Frequencies <frequencies>                 | `plasmapy.formulary.frequencies`        |
+   |    :maxdepth: 1                                        |                                         |
+   +--------------------------------------------------------+-----------------------------------------+
    | .. toctree:: Ionization <ionization>                   | `plasmapy.formulary.ionization`         |
    |    :maxdepth: 1                                        |                                         |
    +--------------------------------------------------------+-----------------------------------------+
@@ -60,9 +63,10 @@ for electron-volts, commonly used in plasma physics to denote
 temperature, although it is technically a unit of energy.
 
 Most functions expect `astropy.units.Quantity` as input, however some
-will use the `~plasmapy.utils.decorators.validate_quantities` decorator
-to automatically cast arguments to Quantities with appropriate units. If
-that happens, you will be notified via an `astropy.units.UnitsWarning`.
+will use the `~plasmapy.utils.decorators.validators.validate_quantities`
+decorator to automatically cast arguments to Quantities with appropriate
+units. If that happens, you will be notified via an
+`astropy.units.UnitsWarning`.
 
 Please note that well maintained physical constant data with units and
 uncertainties can be found in `astropy.constants`.
diff --git a/docs/notebooks/ExB_drift.ipynb b/docs/notebooks/ExB_drift.ipynb
index 016e2f17..8d9c8c8b 100644
--- a/docs/notebooks/ExB_drift.ipynb
+++ b/docs/notebooks/ExB_drift.ipynb
@@ -51,7 +51,7 @@
     "# Setup proton in uniform B field\n",
     "B = 5 * u.T\n",
     "proton = particles.Particle(\"p+\")\n",
-    "omega_c = formulary.parameters.gyrofrequency(B, proton)\n",
+    "omega_c = formulary.frequencies.gyrofrequency(B, proton)\n",
     "v_perp = 1 * u.m / u.s\n",
     "r_L = formulary.lengths.gyroradius(B, proton, Vperp=v_perp)"
    ]
diff --git a/docs/notebooks/dispersion/two_fluid_dispersion.ipynb b/docs/notebooks/dispersion/two_fluid_dispersion.ipynb
index 3a447211..a924c767 100644
--- a/docs/notebooks/dispersion/two_fluid_dispersion.ipynb
+++ b/docs/notebooks/dispersion/two_fluid_dispersion.ipynb
@@ -80,12 +80,12 @@
     "import numpy as np\n",
     "\n",
     "from astropy.constants.si import c\n",
-    "from matplotlib import colors\n",
     "from matplotlib.ticker import MultipleLocator\n",
     "from mpl_toolkits.axes_grid1 import make_axes_locatable\n",
     "\n",
     "from plasmapy.dispersion.analytical.two_fluid_ import two_fluid\n",
     "from plasmapy.formulary import parameters as pfp\n",
+    "from plasmapy.formulary.frequencies import gyrofrequency, plasma_frequency, wc_, wp_\n",
     "from plasmapy.formulary.lengths import inertial_length\n",
     "from plasmapy.particles import Particle\n",
     "\n",
@@ -131,10 +131,10 @@
     "        inputs[\"n_i\"],\n",
     "        ion=inputs[\"ion\"],\n",
     "    ),\n",
-    "    \"wci\": pfp.gyrofrequency(inputs[\"B\"], inputs[\"ion\"]),\n",
+    "    \"wci\": gyrofrequency(inputs[\"B\"], inputs[\"ion\"]),\n",
     "}\n",
     "params[\"lpe\"] = inertial_length(params[\"n_e\"], \"e-\")\n",
-    "params[\"wpe\"] = pfp.plasma_frequency(params[\"n_e\"], \"e-\")"
+    "params[\"wpe\"] = plasma_frequency(params[\"n_e\"], \"e-\")"
    ]
   },
   {
@@ -266,10 +266,10 @@
     "        inputs[\"n_i\"],\n",
     "        ion=inputs[\"ion\"],\n",
     "    ),\n",
-    "    \"wci\": pfp.gyrofrequency(inputs[\"B\"], inputs[\"ion\"]),\n",
+    "    \"wci\": gyrofrequency(inputs[\"B\"], inputs[\"ion\"]),\n",
     "}\n",
     "params[\"lpe\"] = inertial_length(params[\"n_e\"], \"e-\")\n",
-    "params[\"wpe\"] = pfp.plasma_frequency(params[\"n_e\"], \"e-\")"
+    "params[\"wpe\"] = plasma_frequency(params[\"n_e\"], \"e-\")"
    ]
   },
   {
@@ -407,11 +407,11 @@
     "params = {\n",
     "    \"n_e\": inputs[\"n_i\"] * abs(inputs[\"ion\"].charge_number),\n",
     "    \"cs\": pfp.cs_(inputs[\"T_e\"], inputs[\"T_i\"], inputs[\"ion\"]),\n",
-    "    \"wci\": pfp.wc_(inputs[\"B\"], inputs[\"ion\"]),\n",
+    "    \"wci\": wc_(inputs[\"B\"], inputs[\"ion\"]),\n",
     "    \"va\": pfp.va_(inputs[\"B\"], inputs[\"n_i\"], ion=inputs[\"ion\"]),\n",
     "}\n",
     "params[\"beta\"] = (params[\"cs\"] / params[\"va\"]).value ** 2\n",
-    "params[\"wpe\"] = pfp.wp_(params[\"n_e\"], \"e-\")\n",
+    "params[\"wpe\"] = wp_(params[\"n_e\"], \"e-\")\n",
     "params[\"Lambda\"] = (inputs[\"k\"] * params[\"va\"] / params[\"wci\"]).value ** 2\n",
     "\n",
     "(params[\"beta\"], params[\"Lambda\"])"
diff --git a/docs/notebooks/physics.ipynb b/docs/notebooks/physics.ipynb
index b94af891..81e6f61d 100644
--- a/docs/notebooks/physics.ipynb
+++ b/docs/notebooks/physics.ipynb
@@ -174,7 +174,7 @@
     "raw_mimetype": "text/restructuredtext"
    },
    "source": [
-    "And the Langmuir wave :func:`~plasmapy.formulary.parameters.plasma_frequency` should be on the order of\n",
+    "And the Langmuir wave :func:`~plasmapy.formulary.frequencies.plasma_frequency` should be on the order of\n",
     "\n"
    ]
   },
diff --git a/docs/notebooks/simulation/particle_stepper.ipynb b/docs/notebooks/simulation/particle_stepper.ipynb
index 9c001fcf..50068da5 100644
--- a/docs/notebooks/simulation/particle_stepper.ipynb
+++ b/docs/notebooks/simulation/particle_stepper.ipynb
@@ -52,7 +52,7 @@
     "raw_mimetype": "text/restructuredtext"
    },
    "source": [
-    "Take a look at the docs to :func:`~plasmapy.formulary.parameters.gyrofrequency` and :class:`~plasmapy.simulation.particletracker.ParticleTracker` for more information"
+    "Take a look at the docs to :func:`~plasmapy.formulary.frequencies.gyrofrequency` and :class:`~plasmapy.simulation.particletracker.ParticleTracker` for more information"
    ]
   },
   {
diff --git a/plasmapy/diagnostics/thomson.py b/plasmapy/diagnostics/thomson.py
index 5fe9c3ac..418a841d 100644
--- a/plasmapy/diagnostics/thomson.py
+++ b/plasmapy/diagnostics/thomson.py
@@ -14,7 +14,8 @@
 from typing import List, Tuple, Union
 
 from plasmapy.formulary.dielectric import permittivity_1D_Maxwellian
-from plasmapy.formulary.parameters import plasma_frequency, thermal_speed
+from plasmapy.formulary.frequencies import plasma_frequency
+from plasmapy.formulary.parameters import thermal_speed
 from plasmapy.particles import Particle
 from plasmapy.utils.decorators import validate_quantities
 
diff --git a/plasmapy/dispersion/analytical/two_fluid_.py b/plasmapy/dispersion/analytical/two_fluid_.py
index cfa38801..cdc47656 100644
--- a/plasmapy/dispersion/analytical/two_fluid_.py
+++ b/plasmapy/dispersion/analytical/two_fluid_.py
@@ -12,6 +12,7 @@
 from typing import Union
 
 from plasmapy.formulary import parameters as pfp
+from plasmapy.formulary.frequencies import gyrofrequency, plasma_frequency
 from plasmapy.particles import Particle
 from plasmapy.particles.exceptions import ChargeError
 from plasmapy.utils.decorators import validate_quantities
@@ -300,8 +301,8 @@ def two_fluid(
             z_mean=z_mean,
         )
     v_A = pfp.Alfven_speed(B, n_i, ion=ion, z_mean=z_mean)
-    omega_ci = pfp.gyrofrequency(B=B, particle=ion, signed=False, Z=z_mean)
-    omega_pe = pfp.plasma_frequency(n=n_e, particle="e-")
+    omega_ci = gyrofrequency(B=B, particle=ion, signed=False, Z=z_mean)
+    omega_pe = plasma_frequency(n=n_e, particle="e-")
 
     # Bellan2012JGR params equation 32
     alpha = np.cos(theta.value) ** 2
diff --git a/plasmapy/dispersion/numerical/hollweg_.py b/plasmapy/dispersion/numerical/hollweg_.py
index c5aa07ea..c1ee99b4 100644
--- a/plasmapy/dispersion/numerical/hollweg_.py
+++ b/plasmapy/dispersion/numerical/hollweg_.py
@@ -11,6 +11,7 @@
 from typing import Union
 
 from plasmapy.formulary import parameters as pfp
+from plasmapy.formulary.frequencies import gyrofrequency, plasma_frequency
 from plasmapy.particles import Particle
 from plasmapy.particles.exceptions import ChargeError
 from plasmapy.utils.decorators import validate_quantities
@@ -282,8 +283,8 @@ def hollweg(
             z_mean=z_mean,
         ).value
         v_A = pfp.Alfven_speed(B, n_i, ion=ion, z_mean=z_mean).value
-        omega_ci = pfp.gyrofrequency(B=B, particle=ion, signed=False, Z=z_mean).value
-        omega_pe = pfp.plasma_frequency(n=n_e, particle="e-").value
+        omega_ci = gyrofrequency(B=B, particle=ion, signed=False, Z=z_mean).value
+        omega_pe = plasma_frequency(n=n_e, particle="e-").value
 
     # strip units from select input args
     k = k.value
diff --git a/plasmapy/formulary/__init__.py b/plasmapy/formulary/__init__.py
index 97780a28..cbcdbc8f 100644
--- a/plasmapy/formulary/__init__.py
+++ b/plasmapy/formulary/__init__.py
@@ -15,6 +15,7 @@
 from plasmapy.formulary.dimensionless import *
 from plasmapy.formulary.distribution import *
 from plasmapy.formulary.drifts import *
+from plasmapy.formulary.frequencies import *
 from plasmapy.formulary.ionization import *
 from plasmapy.formulary.lengths import *
 from plasmapy.formulary.magnetostatics import *
@@ -36,6 +37,7 @@
     "dimensionless",
     "distribution",
     "drifts",
+    "frequencies",
     "ionization",
     "lengths",
     "magnetostatics",
diff --git a/plasmapy/formulary/dielectric.py b/plasmapy/formulary/dielectric.py
index 347caafb..71d35b5b 100644
--- a/plasmapy/formulary/dielectric.py
+++ b/plasmapy/formulary/dielectric.py
@@ -12,6 +12,7 @@
 
 from plasmapy.dispersion.dispersionfunction import plasma_dispersion_func_deriv
 from plasmapy.formulary import parameters
+from plasmapy.formulary.frequencies import gyrofrequency, plasma_frequency
 from plasmapy.utils.decorators import validate_quantities
 
 r"""
@@ -108,8 +109,8 @@ def cold_plasma_permittivity_SDP(B: u.T, species, n, omega: u.rad / u.s):
     S, D, P = 1, 0, 1
 
     for s, n_s in zip(species, n):
-        omega_c = parameters.gyrofrequency(B=B, particle=s, signed=True)
-        omega_p = parameters.plasma_frequency(n=n_s, particle=s)
+        omega_c = gyrofrequency(B=B, particle=s, signed=True)
+        omega_p = plasma_frequency(n=n_s, particle=s)
 
         S += -(omega_p ** 2) / (omega ** 2 - omega_c ** 2)
         D += omega_c / omega * omega_p ** 2 / (omega ** 2 - omega_c ** 2)
@@ -196,8 +197,8 @@ def cold_plasma_permittivity_LRP(B: u.T, species, n, omega: u.rad / u.s):
     L, R, P = 1, 1, 1
 
     for s, n_s in zip(species, n):
-        omega_c = parameters.gyrofrequency(B=B, particle=s, signed=True)
-        omega_p = parameters.plasma_frequency(n=n_s, particle=s)
+        omega_c = gyrofrequency(B=B, particle=s, signed=True)
+        omega_p = plasma_frequency(n=n_s, particle=s)
 
         L += -(omega_p ** 2) / (omega * (omega - omega_c))
         R += -(omega_p ** 2) / (omega * (omega + omega_c))
@@ -295,7 +296,7 @@ def permittivity_1D_Maxwellian(
     # thermal velocity
     vTh = parameters.thermal_speed(T=T, particle=particle, method="most_probable")
     # plasma frequency
-    wp = parameters.plasma_frequency(n=n, particle=particle, z_mean=z_mean)
+    wp = plasma_frequency(n=n, particle=particle, z_mean=z_mean)
     # scattering parameter alpha.
     # explicitly removing factor of sqrt(2) to be consistent with Froula
     alpha = np.sqrt(2) * (wp / (kWave * vTh)).to(u.dimensionless_unscaled)
diff --git a/plasmapy/formulary/frequencies.py b/plasmapy/formulary/frequencies.py
new file mode 100644
index 00000000..f219afca
--- /dev/null
+++ b/plasmapy/formulary/frequencies.py
@@ -0,0 +1,530 @@
+"""Functions to calculate fundamental plasma frequency parameters."""
+__all__ = [
+    "gyrofrequency",
+    "lower_hybrid_frequency",
+    "plasma_frequency",
+    "upper_hybrid_frequency",
+]
+__aliases__ = ["oc_", "wc_", "wlh_", "wp_", "wuh_"]
+__lite_funcs__ = ["plasma_frequency_lite"]
+
+import astropy.units as u
+import numbers
+import numpy as np
+
+from astropy.constants.si import e, eps0
+from numba import njit
+
+from plasmapy import particles
+from plasmapy.particles import Particle
+from plasmapy.utils.decorators import (
+    angular_freq_to_hz,
+    bind_lite_func,
+    preserve_signature,
+    validate_quantities,
+)
+
+__all__ += __aliases__ + __lite_funcs__
+
+e_si_unitless = e.value
+eps0_si_unitless = eps0.value
+
+
+@validate_quantities(
+    validations_on_return={
+        "units": [u.rad / u.s, u.Hz],
+        "equivalencies": [(u.cy / u.s, u.Hz)],
+    }
+)
+@angular_freq_to_hz
+def gyrofrequency(B: u.T, particle: Particle, signed=False, Z=None) -> u.rad / u.s:
+    r"""
+    Calculate the particle gyrofrequency in units of radians per second.
+
+    **Aliases:** `oc_`, `wc_`
+
+    Parameters
+    ----------
+    B : `~astropy.units.Quantity`
+        The magnetic field magnitude in units convertible to tesla.
+
+    particle : `~plasmapy.particles.particle_class.Particle`
+        Representation of the particle species (e.g., 'p' for protons, 'D+'
+        for deuterium, or 'He-4 +1' for singly ionized helium-4). If no
+        charge state information is provided, then the particles are assumed
+        to be singly charged.
+
+    signed : `bool`, optional
+        The gyrofrequency can be defined as signed (negative for electron,
+        positive for ion). Default is `False` (unsigned, i.e. always
+        positive).
+
+    Z : `float` or `~astropy.units.Quantity`, optional
+        The average ionization (arithmetic mean) for a plasma where
+        a macroscopic description is valid. If this quantity is not
+        given then the charge number of the ion
+        is used. This is effectively an average gyrofrequency for the
+        plasma where multiple charge states are present, and should
+        not be interpreted as the gyrofrequency for any single particle.
+        If not provided, it defaults to the charge number of the ``particle``.
+
+    Returns
+    -------
+    omega_c : `~astropy.units.Quantity`
+        The particle gyrofrequency in units of radians per second.
+
+    Raises
+    ------
+    `TypeError`
+        If the magnetic field is not a `~astropy.units.Quantity` or
+        ``particle`` is not of an appropriate type.
+
+    `ValueError`
+        If the magnetic field contains invalid values or particle cannot
+        be used to identify a particle or isotope.
+
+    Warns
+    -----
+    : `~astropy.units.UnitsWarning`
+        If units are not provided, SI units are assumed.
+
+    Notes
+    -----
+    The particle gyrofrequency is the angular frequency of particle
+    gyration around magnetic field lines and is given by:
+
+    .. math::
+        ω_{c} = \frac{Z e B}{m}
+
+    The particle gyrofrequency is also known as the particle cyclotron
+    frequency or the particle Larmor frequency.
+
+    The recommended way to convert from angular frequency to frequency
+    is to use an equivalency between cycles per second and hertz, as
+    Astropy's `~astropy.units.dimensionles_angles` equivalency does not
+    account for the factor of :math:`2π` needed during this conversion.  The
+    `~astropy.units.dimensionless_angles` equivalency is appropriate
+    when dividing a velocity by an angular frequency to get a length scale.
+
+    Examples
+    --------
+    >>> from astropy import units as u
+    >>> gyrofrequency(0.1*u.T, 'e-')
+    <Quantity 1.7588...e+10 rad / s>
+    >>> gyrofrequency(0.1*u.T, 'e-', to_hz=True)
+    <Quantity 2.79924...e+09 Hz>
+    >>> gyrofrequency(0.1*u.T, 'e-', signed=True)
+    <Quantity -1.75882...e+10 rad / s>
+    >>> gyrofrequency(0.01*u.T, 'p')
+    <Quantity 957883.32... rad / s>
+    >>> gyrofrequency(0.01*u.T, 'p', signed=True)
+    <Quantity 957883.32... rad / s>
+    >>> gyrofrequency(0.01*u.T, particle='T+')
+    <Quantity 319964.5... rad / s>
+    >>> gyrofrequency(0.01*u.T, particle='T+', to_hz=True)
+    <Quantity 50923.9... Hz>
+    >>> omega_ce = gyrofrequency(0.1*u.T, 'e-')
+    >>> print(omega_ce)
+    1758820... rad / s
+    >>> f_ce = omega_ce.to(u.Hz, equivalencies=[(u.cy/u.s, u.Hz)])
+    >>> print(f_ce)
+    279924... Hz
+
+    """
+    from plasmapy.formulary.parameters import _grab_charge
+
+    m = particles.particle_mass(particle)
+    Z = _grab_charge(particle, Z)
+    if not signed:
+        Z = abs(Z)
+
+    omega_c = u.rad * (Z * e * np.abs(B) / m).to(1 / u.s)
+
+    return omega_c
+
+
+oc_ = gyrofrequency
+"""Alias to `~plasmapy.formulary.frequencies.gyrofrequency`."""
+
+wc_ = gyrofrequency
+"""Alias to `~plasmapy.formulary.frequencies.gyrofrequency`."""
+
+
+@preserve_signature
+@njit
+def plasma_frequency_lite(
+    n: numbers.Real, mass: numbers.Real, z_mean: numbers.Real, to_hz: bool = False
+) -> numbers.Real:
+    r"""
+    The ":term:`lite-function`" version of
+    `~plasmapy.formulary.frequencies.plasma_frequency`.  Performs the
+    same plasma frequency calculation as
+    `~plasmapy.formulary.frequencies.plasma_frequency`, but is intended
+    for computational use and, thus, has all data conditioning
+    safeguards removed.
+
+    Parameters
+    ----------
+    n : `~numbers.Real`
+        Particle number density, in units of m\ :sup:`-3`.
+
+    mass : `~numbers.Real`
+        Mass of the particle, in units of kg.
+
+    z_mean : `~numbers.Real`
+        The average ionization (arithmetic mean) for the particle
+        species in the plasma.  For example, a proton would have a value
+        of ``z_mean=1``.
+
+    to_hz : `bool`
+        (Default `False`) Set `True` to apply the factor of
+        :math:`1/2π` and return a value in units of Hz.
+
+    Returns
+    -------
+    wp : `~numbers.Real`
+        The particle plasma frequency in radians per second.  Setting
+        keyword ``to_hz=True`` will apply the factor of :math:`1/2π`
+        and yield a value in Hz.
+
+    Notes
+    -----
+
+    The particle plasma frequency is
+
+    .. math::
+        ω_{p} = Z |e| \sqrt{\frac{n}{\epsilon_0 m}}
+
+    where :math:`m` is the mass of the particle, :math:`e` is the
+    fundamental unit of charge, :math:`Z` is the average charge state
+    ``z_mean`` of the particle species, :math:`n` is the particle number
+    density.  This form of the plasma frequency has units of
+    radians / s, but when using the ``to_hz`` keyword a factor of
+    :math:`1/2π` will be applied to give a value in Hz.
+
+    Examples
+    --------
+
+    >>> from plasmapy.particles import Particle
+    >>> mass = Particle("p").mass.value
+    >>> plasma_frequency_lite(n=1e19, mass=mass, z_mean=1)
+    416329...
+    >>> plasma_frequency_lite(n=1e19, mass=mass, z_mean=1, to_hz=True)
+    662608...
+    """
+    omega_p = z_mean * e_si_unitless * np.sqrt(n / (eps0_si_unitless * mass))
+
+    if to_hz:
+        return omega_p / (2.0 * np.pi)
+
+    return omega_p
+
+
+@bind_lite_func(plasma_frequency_lite)
+@validate_quantities(
+    n={"can_be_negative": False},
+    validations_on_return={
+        "units": [u.rad / u.s, u.Hz],
+        "equivalencies": [(u.cy / u.s, u.Hz)],
+    },
+)
+@angular_freq_to_hz
+def plasma_frequency(n: u.m ** -3, particle: Particle, z_mean=None) -> u.rad / u.s:
+    r"""Calculate the particle plasma frequency.
+
+    **Aliases:** `wp_`
+
+    **Lite Version:** `~plasmapy.formulary.frequencies.plasma_frequency_lite`
+
+    Parameters
+    ----------
+    n : `~astropy.units.Quantity`
+        Particle number density in units convertible to m\ :sup:`-3`.
+
+    particle : `~plasmapy.particles.particle_class.Particle`
+        Representation of the particle species (e.g., ``"p"`` for
+        protons, ``"D+"`` for deuterium, or ``"He-4 +1"`` for singly
+        ionized helium-4). If no charge state information is provided,
+        then the particles are assumed to be singly charged.
+
+    z_mean : `~numbers.Real`, optional
+        The average ionization (arithmetic mean) for the particle
+        species in the plasma.  Typically, the charge state will be
+        dervied from the ``particle`` argument, but this keyword will
+        override that behavior.
+
+    Returns
+    -------
+    omega_p : `~astropy.units.Quantity`
+        The particle plasma frequency in radians per second.  Setting
+        keyword ``to_hz=True`` will apply the factor of :math:`1/2π`
+        and yield a value in Hz.
+
+    Raises
+    ------
+    `TypeError`
+        If ``n`` is not a `~astropy.units.Quantity` or particle is not
+        of an appropriate type.
+
+    `~astropy.units.UnitConversionError`
+        If ``n`` is not in correct units.
+
+    `ValueError`
+        If ``n`` contains invalid values or particle cannot be used to
+        identify a particle or isotope.
+
+    Warns
+    -----
+    : `~astropy.units.UnitsWarning`
+        If units are not provided, SI units are assumed.
+
+    Notes
+    -----
+    The particle plasma frequency is
+
+    .. math::
+        ω_{p} = Z |e| \sqrt{\frac{n}{\epsilon_0 m}}
+
+    where :math:`m` is the mass of the particle, :math:`e` is the
+    fundamental unit of charge, :math:`Z` is the average charge state
+    ``z_mean`` of the particle species, :math:`n` is the particle number
+    density.  This form of the plasma frequency has units of
+    radians / s, but using the ``to_hz`` will apply the factor of
+    :math:`1/2π` to give a value in Hz.
+
+    Examples
+    --------
+    >>> from astropy import units as u
+    >>> plasma_frequency(1e19*u.m**-3, particle='p')
+    <Quantity 4.16329...e+09 rad / s>
+    >>> plasma_frequency(1e19*u.m**-3, particle='p', to_hz=True)
+    <Quantity 6.62608...e+08 Hz>
+    >>> plasma_frequency(1e19*u.m**-3, particle='D+')
+    <Quantity 2.94462...e+09 rad / s>
+    >>> plasma_frequency(1e19*u.m**-3, 'e-')
+    <Quantity 1.78398...e+11 rad / s>
+    >>> plasma_frequency(1e19*u.m**-3, 'e-', to_hz=True)
+    <Quantity 2.83930...e+10 Hz>
+
+    For user convienence
+    `~plasmapy.formulary.frequencies.plasma_frequency_lite` is bound to
+    this function and can be used as follows.
+
+    >>> from plasmapy.particles import Particle
+    >>> mass = Particle("p").mass.value
+    >>> plasma_frequency.lite(n=1e19, mass=mass, z_mean=1)
+    416329...
+    >>> plasma_frequency.lite(n=1e19, mass=mass, z_mean=1, to_hz=True)
+    662608...
+    """
+
+    try:
+        m = particles.particle_mass(particle).value
+
+        if z_mean is None:
+            # warnings.warn("No z_mean given, defaulting to atomic charge",
+            #               PhysicsWarning)
+            try:
+                Z = particles.charge_number(particle)
+            except Exception:
+                Z = 1
+        else:
+            # using user provided average ionization
+            Z = z_mean
+        Z = np.abs(Z)
+        # TODO REPLACE WITH Z = np.abs(_grab_charge(particle, z_mean)), some bugs atm
+    except Exception:
+        raise ValueError(f"Invalid particle, {particle}, in plasma_frequency.")
+
+    omega_p = plasma_frequency_lite(n=n, mass=m, z_mean=Z) * u.rad / u.s
+    return omega_p
+
+
+wp_ = plasma_frequency
+"""Alias to `~plasmapy.formulary.frequencies.plasma_frequency`."""
+
+
+@validate_quantities(
+    n_i={"can_be_negative": False},
+    validations_on_return={
+        "units": [u.rad / u.s, u.Hz],
+        "equivalencies": [(u.cy / u.s, u.Hz)],
+    },
+)
+@angular_freq_to_hz
+def lower_hybrid_frequency(B: u.T, n_i: u.m ** -3, ion: Particle) -> u.rad / u.s:
+    r"""
+    Return the lower hybrid frequency.
+
+    **Aliases:** `wlh_`
+
+    Parameters
+    ----------
+    B : `~astropy.units.Quantity`
+        The magnetic field magnitude in units convertible to tesla.
+
+    n_i : `~astropy.units.Quantity`
+        Ion number density.
+
+    ion : `~plasmapy.particles.particle_class.Particle`
+        Representation of the ion species (e.g., ``'p'`` for protons, ``'D+'``
+        for deuterium, or ``'He-4 +1'`` for singly ionized helium-4). If no
+        charge state information is provided, then the ions are assumed to
+        be singly charged.
+
+    Returns
+    -------
+    omega_lh : `~astropy.units.Quantity`
+        The lower hybrid frequency in radians per second.
+
+    Raises
+    ------
+    `TypeError`
+        If either of ``B`` or ``n_i`` is not a `~astropy.units.Quantity`,
+        or ion is of an inappropriate type.
+
+    `~astropy.units.UnitConversionError`
+        If either of ``B`` or ``n_i`` is in incorrect units.
+
+    `ValueError`
+        If either of ``B`` or ``n_i`` contains invalid values or are of
+        incompatible dimensions, or ion cannot be used to identify an
+        ion or isotope.
+
+    Warns
+    -----
+    : `~astropy.units.UnitsWarning`
+        If units are not provided, SI units are assumed.
+
+    Notes
+    -----
+    The lower hybrid frequency is given through the relation
+
+    .. math::
+        \frac{1}{ω_{lh}^2} = \frac{1}{ω_{ci}^2 + ω_{pi}^2} +
+        \frac{1}{ω_{ci}ω_{ce}}
+
+    where :math:`ω_{ci}` is the ion gyrofrequency,
+    :math:`ω_{ce}` is the electron gyrofrequency, and
+    :math:`ω_{pi}` is the ion plasma frequency.
+
+    The lower hybrid frequency consitutes a resonance for electromagnetic
+    waves in magnetized plasmas, namely for the X-mode. These are waves
+    with their wave electric field being perpendicular to the background
+    magnetic field. For the lower hybrid frequency, ion and electron
+    dynamics both play a role. As the name suggests, it has a lower frequency
+    compared to the upper hybrid frequency. It can play an important role
+    for heating and current drive in fusion plasmas.
+
+    Examples
+    --------
+    >>> from astropy import units as u
+    >>> lower_hybrid_frequency(0.2*u.T, n_i=5e19*u.m**-3, ion='D+')
+    <Quantity 5.78372...e+08 rad / s>
+    >>> lower_hybrid_frequency(0.2*u.T, n_i=5e19*u.m**-3, ion='D+', to_hz = True)
+    <Quantity 92050879.3... Hz>
+
+    """
+    # We do not need a charge state here, so the sole intent is to
+    # catch invalid ions.
+    try:
+        particles.charge_number(ion)
+    except Exception:
+        raise ValueError("Invalid ion in lower_hybrid_frequency.")
+
+    omega_ci = gyrofrequency(B, particle=ion)
+    omega_pi = plasma_frequency(n_i, particle=ion)
+    omega_ce = gyrofrequency(B, particle="e-")
+    omega_lh = ((omega_ci * omega_ce) ** -1 + omega_pi ** -2) ** -0.5
+    # TODO possibly optimize the above line via np.sqrt
+    omega_lh = omega_lh
+
+    return omega_lh
+
+
+wlh_ = lower_hybrid_frequency
+"""Alias to `~plasmapy.formulary.frequencies.lower_hybrid_frequency`."""
+
+
+@validate_quantities(
+    n_e={"can_be_negative": False},
+    validations_on_return={
+        "units": [u.rad / u.s, u.Hz],
+        "equivalencies": [(u.cy / u.s, u.Hz)],
+    },
+)
+@angular_freq_to_hz
+def upper_hybrid_frequency(B: u.T, n_e: u.m ** -3) -> u.rad / u.s:
+    r"""
+    Return the upper hybrid frequency.
+
+    **Aliases:** `wuh_`
+
+    Parameters
+    ----------
+    B : `~astropy.units.Quantity`
+        The magnetic field magnitude in units convertible to tesla.
+
+    n_e : `~astropy.units.Quantity`
+        The electron number density.
+
+    Returns
+    -------
+    omega_uh : `~astropy.units.Quantity`
+        The upper hybrid frequency in radians per second.
+
+    Raises
+    ------
+    `TypeError`
+        If either of ``B`` or ``n_e`` is not a `~astropy.units.Quantity`.
+
+    `~astropy.units.UnitConversionError`
+        If either of ``B`` or ``n_e`` is in incorrect units.
+
+    `ValueError`
+        If either of ``B`` or ``n_e`` contains invalid values or are of
+        incompatible dimensions.
+
+    Warns
+    -----
+    : `~astropy.units.UnitsWarning`
+        If units are not provided, SI units are assumed.
+
+    Notes
+    -----
+    The upper hybrid frequency is given through the relation
+
+    .. math::
+        ω_{uh}^2 = ω_{ce}^2 + ω_{pe}^2
+
+    where :math:`ω_{ce}` is the electron gyrofrequency and
+    :math:`ω_{pe}` is the electron plasma frequency.
+
+    The upper hybrid frequency is a resonance for electromagnetic
+    waves in magnetized plasmas, namely for the X-mode. These are
+    waves with their wave electric field being perpendicular to
+    the background magnetic field. In the cold plasma model, i.e.
+    without any finite temperature effects, the resonance acts
+    merely as a resonance such that power can be deposited there.
+    If finite temperature effects are considered, mode conversion
+    can occur at the upper hybrid resonance, coupling to the
+    electrostatic electron Bernstein wave.
+
+    Examples
+    --------
+    >>> from astropy import units as u
+    >>> upper_hybrid_frequency(0.2*u.T, n_e=5e19*u.m**-3)
+    <Quantity 4.00459...e+11 rad / s>
+    >>> upper_hybrid_frequency(0.2*u.T, n_e=5e19*u.m**-3, to_hz = True)
+    <Quantity 6.37350...e+10 Hz>
+
+    """
+    omega_pe = plasma_frequency(n=n_e, particle="e-")
+    omega_ce = gyrofrequency(B, "e-")
+    omega_uh = np.sqrt(omega_pe ** 2 + omega_ce ** 2)
+
+    return omega_uh
+
+
+wuh_ = upper_hybrid_frequency
+"""Alias to `~plasmapy.formulary.frequencies.upper_hybrid_frequency`."""
diff --git a/plasmapy/formulary/lengths.py b/plasmapy/formulary/lengths.py
index 2696de73..b0c6618d 100644
--- a/plasmapy/formulary/lengths.py
+++ b/plasmapy/formulary/lengths.py
@@ -9,6 +9,7 @@
 from astropy.constants.si import c, e, eps0, k_B
 
 from plasmapy import particles
+from plasmapy.formulary.frequencies import gyrofrequency, plasma_frequency
 from plasmapy.particles import Particle
 from plasmapy.utils.decorators import validate_quantities
 from plasmapy.utils.exceptions import PlasmaPyFutureWarning
@@ -87,7 +88,7 @@ def Debye_length(T_e: u.K, n_e: u.m ** -3) -> u.m:
 
 
 lambdaD_ = Debye_length
-"""Alias to `~plasmapy.formulary.parameters.Debye_length`."""
+"""Alias to `~plasmapy.formulary.lengths.Debye_length`."""
 
 
 @validate_quantities(
@@ -206,9 +207,8 @@ def gyroradius(
     <Quantity 0.001421... m>
     """
 
-    # TODO: remove when gyrofrequncy moves to plasmapy.formulary.frequencies
     # TODO: remove when thermal_speed moves to plasmapy.formulary.speeds
-    from plasmapy.formulary.parameters import gyrofrequency, thermal_speed
+    from plasmapy.formulary.parameters import thermal_speed
 
     # Backwards Compatibility and Deprecation check for keyword T_i
     if T_i is not None:
@@ -280,10 +280,10 @@ def gyroradius(
 
 
 rc_ = gyroradius
-"""Alias to `~plasmapy.formulary.parameters.gyroradius`."""
+"""Alias to `~plasmapy.formulary.lengths.gyroradius`."""
 
 rhoc_ = gyroradius
-"""Alias to `~plasmapy.formulary.parameters.gyroradius`."""
+"""Alias to `~plasmapy.formulary.lengths.gyroradius`."""
 
 
 @validate_quantities(
@@ -350,9 +350,6 @@ def inertial_length(n: u.m ** -3, particle: Particle) -> u.m:
     <Quantity 2376534.75... m>
 
     """
-    # TODO: remove when plasma_frequency moves to plasmapy.formulary.frequencies
-    from plasmapy.formulary.parameters import plasma_frequency
-
     omega_p = plasma_frequency(n, particle=particle)
 
     return c / omega_p
@@ -360,7 +357,7 @@ def inertial_length(n: u.m ** -3, particle: Particle) -> u.m:
 
 cwp_ = inertial_length
 """
-Alias to `~plasmapy.formulary.parameters.inertial_length`.
+Alias to `~plasmapy.formulary.lengths.inertial_length`.
 
 * Name is shorthand for :math:`c / ω_p`.
 """
diff --git a/plasmapy/formulary/parameters.py b/plasmapy/formulary/parameters.py
index 1d8437a0..b4922d97 100644
--- a/plasmapy/formulary/parameters.py
+++ b/plasmapy/formulary/parameters.py
@@ -3,47 +3,31 @@
 __all__ = [
     "Alfven_speed",
     "Bohm_diffusion",
-    "Debye_length",
     "Debye_number",
-    "gyrofrequency",
-    "gyroradius",
     "Hall_parameter",
-    "inertial_length",
     "ion_sound_speed",
     "kappa_thermal_speed",
-    "lower_hybrid_frequency",
     "magnetic_energy_density",
     "magnetic_pressure",
     "mass_density",
-    "plasma_frequency",
     "thermal_pressure",
     "thermal_speed",
     "thermal_speed_coefficients",
-    "upper_hybrid_frequency",
 ]
 __aliases__ = [
     "betaH_",
     "cs_",
-    "cwp_",
     "DB_",
-    "lambdaD_",
     "nD_",
-    "oc_",
     "pmag_",
     "pth_",
-    "rc_",
     "rho_",
-    "rhoc_",
     "ub_",
     "va_",
     "vth_",
     "vth_kappa_",
-    "wc_",
-    "wp_",
-    "wlh_",
-    "wuh_",
 ]
-__lite_funcs__ = ["thermal_speed_lite", "plasma_frequency_lite"]
+__lite_funcs__ = ["thermal_speed_lite"]
 
 import astropy.units as u
 import numbers
@@ -55,12 +39,11 @@
 from typing import Optional, Union
 
 from plasmapy import particles
-from plasmapy.formulary import lengths
+from plasmapy.formulary import frequencies, lengths
 from plasmapy.particles import Particle
 from plasmapy.particles.exceptions import ChargeError
 from plasmapy.utils import PhysicsError
 from plasmapy.utils.decorators import (
-    angular_freq_to_hz,
     bind_lite_func,
     check_relativistic,
     deprecated,
@@ -73,74 +56,45 @@
     RelativityWarning,
 )
 
-__all__ += __aliases__ + __lite_funcs__
+__aliases__ += frequencies.__aliases__ + lengths.__aliases__
+__lite_funcs__ += frequencies.__lite_funcs__
+__all__ += frequencies.__all__ + lengths.__all__ + __aliases__ + __lite_funcs__
 
 e_si_unitless = e.value
 eps0_si_unitless = eps0.value
 k_B_si_unitless = k_B.value
 
-Debye_length = deprecated(
-    since="0.7.0",
-    warning_type=PlasmaPyFutureWarning,
-    message=(
-        "The Debye_length() function has been moved to plasmapy.formulary.lengths."
-        "  Update your import to get rid of this warning."
-    ),
-)(lengths.Debye_length)
-
-lambdaD_ = deprecated(
-    since="0.7.0",
-    warning_type=PlasmaPyFutureWarning,
-    message=(
-        "The lambdaD_() function has been moved to plasmapy.formulary.lengths."
-        "  Update your import to get rid of this warning."
-    ),
-)(lengths.lambdaD_)
-
-gyroradius = deprecated(
-    since="0.7.0",
-    warning_type=PlasmaPyFutureWarning,
-    message=(
-        "The gyroradius() function has been moved to plasmapy.formulary.lengths."
-        "  Update your import to get rid of this warning."
-    ),
-)(lengths.gyroradius)
-
-rc_ = deprecated(
-    since="0.7.0",
-    warning_type=PlasmaPyFutureWarning,
-    message=(
-        "The rc_() function has been moved to plasmapy.formulary.lengths."
-        "  Update your import to get rid of this warning."
-    ),
-)(lengths.rc_)
-
-rhoc_ = deprecated(
-    since="0.7.0",
-    warning_type=PlasmaPyFutureWarning,
-    message=(
-        "The inertial_length() function has been moved to plasmapy.formulary.lengths."
-        "  Update your import to get rid of this warning."
-    ),
-)(lengths.rhoc_)
-
-inertial_length = deprecated(
-    since="0.7.0",
-    warning_type=PlasmaPyFutureWarning,
-    message=(
-        "The inertial_length() function has been moved to plasmapy.formulary.lengths."
-        "  Update your import to get rid of this warning."
-    ),
-)(lengths.inertial_length)
-
-cwp_ = deprecated(
-    since="0.7.0",
-    warning_type=PlasmaPyFutureWarning,
-    message=(
-        "The cwp_() function has been moved to plasmapy.formulary.lengths."
-        "  Update your import to get rid of this warning."
-    ),
-)(lengths.cwp_)
+funcs_to_deprecate_wrap = [  # (module_name, func_name)
+    ("lengths", "Debye_length"),
+    ("lengths", "lambdaD_"),
+    ("lengths", "gyroradius"),
+    ("lengths", "rc_"),
+    ("lengths", "rhoc_"),
+    ("lengths", "inertial_length"),
+    ("lengths", "cwp_"),
+    ("frequencies", "gyrofrequency"),
+    ("frequencies", "oc_"),
+    ("frequencies", "wc_"),
+    ("frequencies", "plasma_frequency"),
+    ("frequencies", "plasma_frequency_lite"),
+    ("frequencies", "wp_"),
+    ("frequencies", "lower_hybrid_frequency"),
+    ("frequencies", "wlh_"),
+    ("frequencies", "upper_hybrid_frequency"),
+    ("frequencies", "wuh_"),
+]
+for modname, name in funcs_to_deprecate_wrap:
+    globals()[name] = deprecated(
+        since="0.7.0",
+        warning_type=PlasmaPyFutureWarning,
+        message=(
+            f"The {name}() function has been moved to "
+            f"plasmapy.formulary.{modname}.  Update your import to get "
+            f"rid of this warning."
+        ),
+    )(getattr(globals()[f"{modname}"], name))
+
+del modname, name
 
 
 def _grab_charge(ion: Particle, z_mean=None):
@@ -1195,7 +1149,7 @@ def Hall_parameter(
 
     See Also
     --------
-    ~plasmapy.formulary.parameters.gyrofrequency
+    ~plasmapy.formulary.frequencies.gyrofrequency
     ~plasmapy.formulary.collisions.fundamental_electron_collision_freq
     ~plasmapy.formulary.collisions.fundamental_ion_collision_freq
     ~plasmapy.formulary.collisions.Coulomb_logarithm
@@ -1229,7 +1183,7 @@ def Hall_parameter(
         fundamental_ion_collision_freq,
     )
 
-    gyro_frequency = gyrofrequency(B, particle)
+    gyro_frequency = frequencies.gyrofrequency(B, particle)
     gyro_frequency = gyro_frequency / u.radian
     if particles.Particle(particle).symbol == "e-":
         coll_rate = fundamental_electron_collision_freq(
@@ -1244,318 +1198,6 @@ def Hall_parameter(
 """Alias to `~plasmapy.formulary.parameters.Hall_parameter`."""
 
 
-@validate_quantities(
-    validations_on_return={
-        "units": [u.rad / u.s, u.Hz],
-        "equivalencies": [(u.cy / u.s, u.Hz)],
-    }
-)
-@angular_freq_to_hz
-def gyrofrequency(B: u.T, particle: Particle, signed=False, Z=None) -> u.rad / u.s:
-    r"""
-    Calculate the particle gyrofrequency in units of radians per second.
-
-    **Aliases:** `oc_`, `wc_`
-
-    Parameters
-    ----------
-    B : `~astropy.units.Quantity`
-        The magnetic field magnitude in units convertible to tesla.
-
-    particle : `~plasmapy.particles.particle_class.Particle`
-        Representation of the particle species (e.g., 'p' for protons, 'D+'
-        for deuterium, or 'He-4 +1' for singly ionized helium-4). If no
-        charge state information is provided, then the particles are assumed
-        to be singly charged.
-
-    signed : `bool`, optional
-        The gyrofrequency can be defined as signed (negative for electron,
-        positive for ion). Default is `False` (unsigned, i.e. always
-        positive).
-
-    Z : `float` or `~astropy.units.Quantity`, optional
-        The average ionization (arithmetic mean) for a plasma where the
-        a macroscopic description is valid. If this quantity is not
-        given then the charge number of the ion
-        is used. This is effectively an average gyrofrequency for the
-        plasma where multiple charge states are present, and should
-        not be interpreted as the gyrofrequency for any single particle.
-        If not provided, it defaults to the charge number of the ``particle``.
-
-    Returns
-    -------
-    omega_c : `~astropy.units.Quantity`
-        The particle gyrofrequency in units of radians per second.
-
-    Raises
-    ------
-    `TypeError`
-        If the magnetic field is not a `~astropy.units.Quantity` or
-        ``particle`` is not of an appropriate type.
-
-    `ValueError`
-        If the magnetic field contains invalid values or particle cannot
-        be used to identify an particle or isotope.
-
-    Warns
-    -----
-    : `~astropy.units.UnitsWarning`
-        If units are not provided, SI units are assumed.
-
-    Notes
-    -----
-    The particle gyrofrequency is the angular frequency of particle
-    gyration around magnetic field lines and is given by:
-
-    .. math::
-        ω_{c} = \frac{Z e B}{m}
-
-    The particle gyrofrequency is also known as the particle cyclotron
-    frequency or the particle Larmor frequency.
-
-    The recommended way to convert from angular frequency to frequency
-    is to use an equivalency between cycles per second and hertz, as
-    Astropy's `~astropy.units.dimensionles_angles` equivalency does not
-    account for the factor of :math:`2π` needed during this conversion.  The
-    `~astropy.units.dimensionless_angles` equivalency is appropriate
-    when dividing a velocity by an angular frequency to get a length scale.
-
-    Examples
-    --------
-    >>> from astropy import units as u
-    >>> gyrofrequency(0.1*u.T, 'e-')
-    <Quantity 1.7588...e+10 rad / s>
-    >>> gyrofrequency(0.1*u.T, 'e-', to_hz=True)
-    <Quantity 2.79924...e+09 Hz>
-    >>> gyrofrequency(0.1*u.T, 'e-', signed=True)
-    <Quantity -1.75882...e+10 rad / s>
-    >>> gyrofrequency(0.01*u.T, 'p')
-    <Quantity 957883.32... rad / s>
-    >>> gyrofrequency(0.01*u.T, 'p', signed=True)
-    <Quantity 957883.32... rad / s>
-    >>> gyrofrequency(0.01*u.T, particle='T+')
-    <Quantity 319964.5... rad / s>
-    >>> gyrofrequency(0.01*u.T, particle='T+', to_hz=True)
-    <Quantity 50923.9... Hz>
-    >>> omega_ce = gyrofrequency(0.1*u.T, 'e-')
-    >>> print(omega_ce)
-    1758820... rad / s
-    >>> f_ce = omega_ce.to(u.Hz, equivalencies=[(u.cy/u.s, u.Hz)])
-    >>> print(f_ce)
-    279924... Hz
-
-    """
-    m = particles.particle_mass(particle)
-    Z = _grab_charge(particle, Z)
-    if not signed:
-        Z = abs(Z)
-
-    omega_c = u.rad * (Z * e * np.abs(B) / m).to(1 / u.s)
-
-    return omega_c
-
-
-oc_ = gyrofrequency
-"""Alias to `~plasmapy.formulary.parameters.gyrofrequency`."""
-
-wc_ = gyrofrequency
-"""Alias to `~plasmapy.formulary.parameters.gyrofrequency`."""
-
-
-@preserve_signature
-@njit
-def plasma_frequency_lite(
-    n: numbers.Real, mass: numbers.Real, z_mean: numbers.Real, to_hz: bool = False
-) -> numbers.Real:
-    r"""
-    The ":term:`lite-function`" version of
-    `~plasmapy.formulary.parameters.plasma_frequency`.  Performs the
-    same plasma frequency calculation as
-    `~plasmapy.formulary.parameters.plasma_frequency`, but is intended
-    for computational use and, thus, has all data conditioning
-    safeguards removed.
-
-    Parameters
-    ----------
-    n : `~numbers.Real`
-        Particle number density, in units of m\ :sup:`-3`.
-
-    mass : `~numbers.Real`
-        Mass of the particle, in units of kg.
-
-    z_mean : `~numbers.Real`
-        The average ionization (arithmetic mean) for the particle
-        species in the plasma.  For example, a proton would have a value
-        of ``z_mean=1``.
-
-    to_hz : `bool`
-        (Default `False`) Set `True` to apply the factor of
-        :math:`1/2π` and return a value in units of Hz.
-
-    Returns
-    -------
-    wp : `~numbers.Real`
-        The particle plasma frequency in radians per second.  Setting
-        keyword ``to_hz=True`` will apply the factor of :math:`1/2π`
-        and yield a value in Hz.
-
-    Notes
-    -----
-
-    The particle plasma frequency is
-
-    .. math::
-        ω_{p} = Z |e| \sqrt{\frac{n}{\epsilon_0 m}}
-
-    where :math:`m` is the mass of the particle, :math:`e` is the
-    fundamental unit of charge, :math:`Z` is the average charge state
-    ``z_mean`` of the particle species, :math:`n` is the particle number
-    density.  This form of the plasma frequency has units of
-    radians / s, but when using the ``to_hz`` keyword a factor of
-    :math:`1/2π` will be applied to give a value in Hz.
-
-    Examples
-    --------
-
-    >>> from plasmapy.particles import Particle
-    >>> mass = Particle("p").mass.value
-    >>> plasma_frequency_lite(n=1e19, mass=mass, z_mean=1)
-    416329...
-    >>> plasma_frequency_lite(n=1e19, mass=mass, z_mean=1, to_hz=True)
-    662608...
-    """
-    omega_p = z_mean * e_si_unitless * np.sqrt(n / (eps0_si_unitless * mass))
-
-    if to_hz:
-        return omega_p / (2.0 * np.pi)
-
-    return omega_p
-
-
-@bind_lite_func(plasma_frequency_lite)
-@validate_quantities(
-    n={"can_be_negative": False},
-    validations_on_return={
-        "units": [u.rad / u.s, u.Hz],
-        "equivalencies": [(u.cy / u.s, u.Hz)],
-    },
-)
-@angular_freq_to_hz
-def plasma_frequency(n: u.m ** -3, particle: Particle, z_mean=None) -> u.rad / u.s:
-    r"""Calculate the particle plasma frequency.
-
-    **Aliases:** `wp_`
-
-    **Lite Version:** `~plasmapy.formulary.parameters.plasma_frequency_lite`
-
-    Parameters
-    ----------
-    n : `~astropy.units.Quantity`
-        Particle number density in units convertible to m\ :sup:`-3`.
-
-    particle : `~plasmapy.particles.particle_class.Particle`
-        Representation of the particle species (e.g., ``"p"`` for
-        protons, ``"D+"`` for deuterium, or ``"He-4 +1"`` for singly
-        ionized helium-4). If no charge state information is provided,
-        then the particles are assumed to be singly charged.
-
-    z_mean : `~numbers.Real`, optional
-        The average ionization (arithmetic mean) for the particle
-        species in the plasma.  Typically the charge state will be
-        dervied from the ``particle`` argument, but this keyword will
-        override that behavior.
-
-    Returns
-    -------
-    omega_p : `~astropy.units.Quantity`
-        The particle plasma frequency in radians per second.  Setting
-        keyword ``to_hz=True`` will apply the factor of :math:`1/2π`
-        and yield a value in Hz.
-
-    Raises
-    ------
-    `TypeError`
-        If ``n`` is not a `~astropy.units.Quantity` or particle is not
-        of an appropriate type.
-
-    `~astropy.units.UnitConversionError`
-        If ``n`` is not in correct units.
-
-    `ValueError`
-        If ``n`` contains invalid values or particle cannot be used to
-        identify an particle or isotope.
-
-    Warns
-    -----
-    : `~astropy.units.UnitsWarning`
-        If units are not provided, SI units are assumed.
-
-    Notes
-    -----
-    The particle plasma frequency is
-
-    .. math::
-        ω_{p} = Z |e| \sqrt{\frac{n}{\epsilon_0 m}}
-
-    where :math:`m` is the mass of the particle, :math:`e` is the
-    fundamental unit of charge, :math:`Z` is the average charge state
-    ``z_mean`` of the particle species, :math:`n` is the particle number
-    density.  This form of the plasma frequency has units of
-    radians / s, but using the ``to_hz`` will apply the factor of
-    :math:`1/2π` to give a value in Hz.
-
-    Examples
-    --------
-    >>> from astropy import units as u
-    >>> plasma_frequency(1e19*u.m**-3, particle='p')
-    <Quantity 4.16329...e+09 rad / s>
-    >>> plasma_frequency(1e19*u.m**-3, particle='p', to_hz=True)
-    <Quantity 6.62608...e+08 Hz>
-    >>> plasma_frequency(1e19*u.m**-3, particle='D+')
-    <Quantity 2.94462...e+09 rad / s>
-    >>> plasma_frequency(1e19*u.m**-3, 'e-')
-    <Quantity 1.78398...e+11 rad / s>
-    >>> plasma_frequency(1e19*u.m**-3, 'e-', to_hz=True)
-    <Quantity 2.83930...e+10 Hz>
-
-    For user convienence
-    `~plasmapy.formulary.parameters.plasma_frequency_lite` is bound to
-    this function and can be used as follows.
-
-    >>> from plasmapy.particles import Particle
-    >>> mass = Particle("p").mass.value
-    >>> plasma_frequency.lite(n=1e19, mass=mass, z_mean=1)
-    416329...
-    >>> plasma_frequency.lite(n=1e19, mass=mass, z_mean=1, to_hz=True)
-    662608...
-    """
-
-    try:
-        m = particles.particle_mass(particle).value
-
-        if z_mean is None:
-            # warnings.warn("No z_mean given, defaulting to atomic charge",
-            #               PhysicsWarning)
-            try:
-                Z = particles.charge_number(particle)
-            except Exception:
-                Z = 1
-        else:
-            # using user provided average ionization
-            Z = z_mean
-        Z = np.abs(Z)
-        # TODO REPLACE WITH Z = np.abs(_grab_charge(particle, z_mean)), some bugs atm
-    except Exception:
-        raise ValueError(f"Invalid particle, {particle}, in plasma_frequency.")
-
-    omega_p = plasma_frequency_lite(n=n, mass=m, z_mean=Z) * u.rad / u.s
-    return omega_p
-
-
-wp_ = plasma_frequency
-"""Alias to `~plasmapy.formulary.parameters.plasma_frequency`."""
-
-
 @validate_quantities(
     T_e={"can_be_negative": False, "equivalencies": u.temperature_energy()},
     n_e={"can_be_negative": False},
@@ -1760,193 +1402,6 @@ def magnetic_energy_density(B: u.T) -> u.J / u.m ** 3:
 """Alias to `~plasmapy.formulary.parameters.magnetic_energy_density`."""
 
 
-@validate_quantities(
-    n_e={"can_be_negative": False},
-    validations_on_return={
-        "units": [u.rad / u.s, u.Hz],
-        "equivalencies": [(u.cy / u.s, u.Hz)],
-    },
-)
-@angular_freq_to_hz
-def upper_hybrid_frequency(B: u.T, n_e: u.m ** -3) -> u.rad / u.s:
-    r"""
-    Return the upper hybrid frequency.
-
-    **Aliases:** `wuh_`
-
-    Parameters
-    ----------
-    B : `~astropy.units.Quantity`
-        The magnetic field magnitude in units convertible to tesla.
-
-    n_e : `~astropy.units.Quantity`
-        The electron number density.
-
-    Returns
-    -------
-    omega_uh : `~astropy.units.Quantity`
-        The upper hybrid frequency in radians per second.
-
-    Raises
-    ------
-    `TypeError`
-        If either of ``B`` or ``n_e`` is not a `~astropy.units.Quantity`.
-
-    `~astropy.units.UnitConversionError`
-        If either of ``B`` or ``n_e`` is in incorrect units.
-
-    `ValueError`
-        If either of ``B`` or ``n_e`` contains invalid values or are of
-        incompatible dimensions.
-
-    Warns
-    -----
-    : `~astropy.units.UnitsWarning`
-        If units are not provided, SI units are assumed.
-
-    Notes
-    -----
-    The upper hybrid frequency is given through the relation
-
-    .. math::
-        ω_{uh}^2 = ω_{ce}^2 + ω_{pe}^2
-
-    where :math:`ω_{ce}` is the electron gyrofrequency and
-    :math:`ω_{pe}` is the electron plasma frequency.
-
-    The upper hybrid frequency is a resonance for electromagnetic
-    waves in magnetized plasmas, namely for the X-mode. These are
-    waves with their wave electric field being perpendicular to
-    the background magnetic field. In the cold plasma model, i.e.
-    without any finite temperature effects, the resonance acts
-    merely as a resonance such that power can be deposited there.
-    If finite temperature effects are considered, mode conversion
-    can occur at the upper hybrid resonance, coupling to the
-    electrostatic electron Bernstein wave.
-
-    Examples
-    --------
-    >>> from astropy import units as u
-    >>> upper_hybrid_frequency(0.2*u.T, n_e=5e19*u.m**-3)
-    <Quantity 4.00459...e+11 rad / s>
-    >>> upper_hybrid_frequency(0.2*u.T, n_e=5e19*u.m**-3, to_hz = True)
-    <Quantity 6.37350...e+10 Hz>
-
-    """
-    omega_pe = plasma_frequency(n=n_e, particle="e-")
-    omega_ce = gyrofrequency(B, "e-")
-    omega_uh = np.sqrt(omega_pe ** 2 + omega_ce ** 2)
-
-    return omega_uh
-
-
-wuh_ = upper_hybrid_frequency
-"""Alias to `~plasmapy.formulary.parameters.upper_hybrid_frequency`."""
-
-
-@validate_quantities(
-    n_i={"can_be_negative": False},
-    validations_on_return={
-        "units": [u.rad / u.s, u.Hz],
-        "equivalencies": [(u.cy / u.s, u.Hz)],
-    },
-)
-@angular_freq_to_hz
-def lower_hybrid_frequency(B: u.T, n_i: u.m ** -3, ion: Particle) -> u.rad / u.s:
-    r"""
-    Return the lower hybrid frequency.
-
-    **Aliases:** `wlh_`
-
-    Parameters
-    ----------
-    B : `~astropy.units.Quantity`
-        The magnetic field magnitude in units convertible to tesla.
-
-    n_i : `~astropy.units.Quantity`
-        Ion number density.
-
-    ion : `~plasmapy.particles.particle_class.Particle`
-        Representation of the ion species (e.g., ``'p'`` for protons, ``'D+'``
-        for deuterium, or ``'He-4 +1'`` for singly ionized helium-4). If no
-        charge state information is provided, then the ions are assumed to
-        be singly charged.
-
-    Returns
-    -------
-    omega_lh : `~astropy.units.Quantity`
-        The lower hybrid frequency in radians per second.
-
-    Raises
-    ------
-    `TypeError`
-        If either of ``B`` or ``n_i`` is not a `~astropy.units.Quantity`,
-        or ion is of an inappropriate type.
-
-    `~astropy.units.UnitConversionError`
-        If either of ``B`` or ``n_i`` is in incorrect units.
-
-    `ValueError`
-        If either of ``B`` or ``n_i`` contains invalid values or are of
-        incompatible dimensions, or ion cannot be used to identify an
-        ion or isotope.
-
-    Warns
-    -----
-    : `~astropy.units.UnitsWarning`
-        If units are not provided, SI units are assumed.
-
-    Notes
-    -----
-    The lower hybrid frequency is given through the relation
-
-    .. math::
-        \frac{1}{ω_{lh}^2} = \frac{1}{ω_{ci}^2 + ω_{pi}^2} +
-        \frac{1}{ω_{ci}ω_{ce}}
-
-    where :math:`ω_{ci}` is the ion gyrofrequency,
-    :math:`ω_{ce}` is the electron gyrofrequency, and
-    :math:`ω_{pi}` is the ion plasma frequency.
-
-    The lower hybrid frequency consitutes a resonance for electromagnetic
-    waves in magnetized plasmas, namely for the X-mode. These are waves
-    with their wave electric field being perpendicular to the background
-    magnetic field. For the lower hybrid frequency, ion and electron
-    dynamics both play a role. As the name suggests, it has a lower frequency
-    compared to the upper hybrid frequency. It can play an important role
-    for heating and current drive in fusion plasmas.
-
-    Examples
-    --------
-    >>> from astropy import units as u
-    >>> lower_hybrid_frequency(0.2*u.T, n_i=5e19*u.m**-3, ion='D+')
-    <Quantity 5.78372...e+08 rad / s>
-    >>> lower_hybrid_frequency(0.2*u.T, n_i=5e19*u.m**-3, ion='D+', to_hz = True)
-    <Quantity 92050879.3... Hz>
-
-    """
-
-    # We do not need a charge state here, so the sole intent is to
-    # catch invalid ions.
-    try:
-        particles.charge_number(ion)
-    except Exception:
-        raise ValueError("Invalid ion in lower_hybrid_frequency.")
-
-    omega_ci = gyrofrequency(B, particle=ion)
-    omega_pi = plasma_frequency(n_i, particle=ion)
-    omega_ce = gyrofrequency(B, particle="e-")
-    omega_lh = ((omega_ci * omega_ce) ** -1 + omega_pi ** -2) ** -0.5
-    # TODO possibly optimize the above line via np.sqrt
-    omega_lh = omega_lh
-
-    return omega_lh
-
-
-wlh_ = lower_hybrid_frequency
-"""Alias to `~plasmapy.formulary.parameters.lower_hybrid_frequency`."""
-
-
 @validate_quantities(
     T_e={"can_be_negative": False, "equivalencies": u.temperature_energy()},
     B={"can_be_negative": False},
diff --git a/plasmapy/formulary/radiation.py b/plasmapy/formulary/radiation.py
index 431b1676..42c3e2fd 100644
--- a/plasmapy/formulary/radiation.py
+++ b/plasmapy/formulary/radiation.py
@@ -13,7 +13,7 @@
 
 from scipy.special import exp1
 
-from plasmapy.formulary.parameters import plasma_frequency
+from plasmapy.formulary.frequencies import plasma_frequency
 from plasmapy.particles import Particle, particle_input
 from plasmapy.utils.decorators import validate_quantities
 from plasmapy.utils.exceptions import PhysicsError


Test patch:
diff --git a/plasmapy/dispersion/analytical/tests/test_two_fluid_.py b/plasmapy/dispersion/analytical/tests/test_two_fluid_.py
index 255ea53a..f335c2e5 100644
--- a/plasmapy/dispersion/analytical/tests/test_two_fluid_.py
+++ b/plasmapy/dispersion/analytical/tests/test_two_fluid_.py
@@ -7,6 +7,7 @@
 
 from plasmapy.dispersion.analytical.two_fluid_ import two_fluid
 from plasmapy.formulary import parameters as pfp
+from plasmapy.formulary.frequencies import wc_
 from plasmapy.particles import Particle
 from plasmapy.utils.exceptions import PhysicsWarning
 
@@ -117,7 +118,7 @@ def test_on_bellan2012_vals(self, kwargs, expected):
 
         cs = pfp.cs_(kwargs["T_e"], kwargs["T_i"], kwargs["ion"])
         va = pfp.va_(kwargs["B"], kwargs["n_i"], ion=kwargs["ion"])
-        wci = pfp.wc_(kwargs["B"], kwargs["ion"])
+        wci = wc_(kwargs["B"], kwargs["ion"])
 
         beta = (cs / va).value ** 2
         if not np.isclose(beta, 0.4, atol=1e-4):
diff --git a/plasmapy/formulary/tests/test_dielectric.py b/plasmapy/formulary/tests/test_dielectric.py
index af04b793..0225e3a6 100644
--- a/plasmapy/formulary/tests/test_dielectric.py
+++ b/plasmapy/formulary/tests/test_dielectric.py
@@ -5,6 +5,8 @@
 
 from astropy import units as u
 
+from plasmapy.formulary.frequencies import gyrofrequency, plasma_frequency
+
 from ..dielectric import (
     cold_plasma_permittivity_LRP,
     cold_plasma_permittivity_SDP,
@@ -12,7 +14,7 @@
     RotatingTensorElements,
     StixTensorElements,
 )
-from ..parameters import gyrofrequency, plasma_frequency, thermal_speed
+from ..parameters import thermal_speed
 
 B = 1.0 * u.T
 n = [1e18 / u.m ** 3]
diff --git a/plasmapy/formulary/tests/test_frequencies.py b/plasmapy/formulary/tests/test_frequencies.py
new file mode 100644
index 00000000..f3e700d3
--- /dev/null
+++ b/plasmapy/formulary/tests/test_frequencies.py
@@ -0,0 +1,189 @@
+"""Tests for functionality contained in `plasmapy.formulary.frequencies`."""
+import astropy.units as u
+import numpy as np
+import pytest
+
+from plasmapy.formulary.frequencies import (
+    gyrofrequency,
+    lower_hybrid_frequency,
+    oc_,
+    plasma_frequency,
+    upper_hybrid_frequency,
+    wc_,
+    wlh_,
+    wuh_,
+)
+from plasmapy.particles.exceptions import InvalidParticleError
+from plasmapy.utils.pytest_helpers import assert_can_handle_nparray
+
+Z = 1
+ion = "p"
+n_i = 5e19 * u.m ** -3
+n_e = Z * 5e19 * u.m ** -3
+
+B = 1.0 * u.T
+B_nanarr = np.array([0.001, np.nan]) * u.T
+
+
+@pytest.mark.parametrize(
+    "alias, parent",
+    [
+        (oc_, gyrofrequency),
+        (wc_, gyrofrequency),
+        (wlh_, lower_hybrid_frequency),
+        (wuh_, upper_hybrid_frequency),
+    ],
+)
+def test_parameters_aliases(alias, parent):
+    """Test all aliases defined in parameters.py"""
+    assert alias is parent
+
+
+def test_gyrofrequency():
+    r"""Test the gyrofrequency function in parameters.py."""
+
+    assert gyrofrequency(B, "e-").unit.is_equivalent(u.rad / u.s)
+
+    assert gyrofrequency(B, "e-", to_hz=True).unit.is_equivalent(u.Hz)
+
+    assert np.isclose(gyrofrequency(1 * u.T, "e-").value, 175882008784.72018)
+
+    assert np.isclose(gyrofrequency(2.4 * u.T, "e-").value, 422116821083.3284)
+
+    assert np.isclose(
+        gyrofrequency(1 * u.T, "e-", to_hz=True).value, 27992490076.528206
+    )
+
+    assert np.isclose(
+        gyrofrequency(2.4 * u.T, "e-", signed=True).value, -422116821083.3284
+    )
+
+    assert np.isclose(gyrofrequency(1 * u.G, "e-").cgs.value, 1.76e7, rtol=1e-3)
+
+    with pytest.raises(TypeError):
+        with pytest.warns(u.UnitsWarning):
+            gyrofrequency(u.m, "e-")
+
+    with pytest.raises(u.UnitTypeError):
+        gyrofrequency(u.m * 1, "e-")
+
+    assert np.isnan(gyrofrequency(B_nanarr, "e-")[-1])
+
+    # The following is a test to check that equivalencies from astropy
+    # are working.
+    omega_ce = gyrofrequency(2.2 * u.T, "e-")
+    f_ce = (omega_ce / (2 * np.pi)) / u.rad
+    f_ce_use_equiv = omega_ce.to(u.Hz, equivalencies=[(u.cy / u.s, u.Hz)])
+    assert np.isclose(f_ce.value, f_ce_use_equiv.value)
+
+    with pytest.warns(u.UnitsWarning):
+        assert gyrofrequency(5.0, "e-") == gyrofrequency(5.0 * u.T, "e-")
+
+    assert gyrofrequency(B, particle=ion).unit.is_equivalent(u.rad / u.s)
+
+    assert np.isclose(gyrofrequency(1 * u.T, particle="p").value, 95788335.834874)
+
+    assert np.isclose(gyrofrequency(2.4 * u.T, particle="p").value, 229892006.00369796)
+
+    assert np.isclose(gyrofrequency(1 * u.G, particle="p").cgs.value, 9.58e3, rtol=2e-3)
+
+    assert gyrofrequency(-5 * u.T, "p") == gyrofrequency(5 * u.T, "p")
+
+    # Case when Z=1 is assumed
+    # assert gyrofrequency(B, particle='p+') == gyrofrequency(B, particle='H-1')
+
+    assert gyrofrequency(B, particle="e+") == gyrofrequency(B, "e-")
+
+    with pytest.warns(u.UnitsWarning):
+        gyrofrequency(8, "p")
+
+    with pytest.raises(u.UnitTypeError):
+        gyrofrequency(5 * u.m, "p")
+
+    with pytest.raises(InvalidParticleError):
+        gyrofrequency(8 * u.T, particle="asdfasd")
+
+    with pytest.warns(u.UnitsWarning):
+        # TODO this should be WARNS, not RAISES. and it's probably still raised
+        assert gyrofrequency(5.0, "p") == gyrofrequency(5.0 * u.T, "p")
+
+    gyrofrequency(1 * u.T, particle="p")
+    # testing for user input Z
+    testMeth1 = gyrofrequency(1 * u.T, particle="p", Z=0.8).si.value
+    testTrue1 = 76630665.79318453
+    errStr = f"gyrofrequency() gave {testMeth1}, should be {testTrue1}."
+    assert np.isclose(testMeth1, testTrue1, atol=0.0, rtol=1e-5), errStr
+
+    assert_can_handle_nparray(gyrofrequency, kwargs={"signed": True})
+
+    assert_can_handle_nparray(gyrofrequency, kwargs={"signed": False})
+
+
+def test_lower_hybrid_frequency():
+    r"""Test the lower_hybrid_frequency function in parameters.py."""
+
+    ion = "He-4 1+"
+    omega_ci = gyrofrequency(B, particle=ion)
+    omega_pi = plasma_frequency(n=n_i, particle=ion)
+    omega_ce = gyrofrequency(B, "e-")
+    omega_lh = lower_hybrid_frequency(B, n_i=n_i, ion=ion)
+    omega_lh_hz = lower_hybrid_frequency(B, n_i=n_i, ion=ion, to_hz=True)
+    assert omega_ci.unit.is_equivalent(u.rad / u.s)
+    assert omega_pi.unit.is_equivalent(u.rad / u.s)
+    assert omega_ce.unit.is_equivalent(u.rad / u.s)
+    assert omega_lh.unit.is_equivalent(u.rad / u.s)
+    left_hand_side = omega_lh ** -2
+    right_hand_side = (
+        1 / (omega_ci ** 2 + omega_pi ** 2) + omega_ci ** -1 * omega_ce ** -1
+    )
+    assert np.isclose(left_hand_side.value, right_hand_side.value)
+
+    assert np.isclose(omega_lh_hz.value, 299878691.3223296)
+
+    with pytest.raises(ValueError):
+        lower_hybrid_frequency(0.2 * u.T, n_i=5e19 * u.m ** -3, ion="asdfasd")
+
+    with pytest.raises(ValueError):
+        lower_hybrid_frequency(0.2 * u.T, n_i=-5e19 * u.m ** -3, ion="asdfasd")
+
+    with pytest.raises(ValueError):
+        lower_hybrid_frequency(np.nan * u.T, n_i=-5e19 * u.m ** -3, ion="asdfasd")
+
+    with pytest.warns(u.UnitsWarning):
+        assert lower_hybrid_frequency(1.3, 1e19, "p+") == lower_hybrid_frequency(
+            1.3 * u.T, 1e19 * u.m ** -3, "p+"
+        )
+    assert_can_handle_nparray(lower_hybrid_frequency)
+
+
+def test_upper_hybrid_frequency():
+    r"""Test the upper_hybrid_frequency function in parameters.py."""
+
+    omega_uh = upper_hybrid_frequency(B, n_e=n_e)
+    omega_uh_hz = upper_hybrid_frequency(B, n_e=n_e, to_hz=True)
+    omega_ce = gyrofrequency(B, "e-")
+    omega_pe = plasma_frequency(n=n_e, particle="e-")
+    assert omega_ce.unit.is_equivalent(u.rad / u.s)
+    assert omega_pe.unit.is_equivalent(u.rad / u.s)
+    assert omega_uh.unit.is_equivalent(u.rad / u.s)
+    assert omega_uh_hz.unit.is_equivalent(u.Hz)
+    left_hand_side = omega_uh ** 2
+    right_hand_side = omega_ce ** 2 + omega_pe ** 2
+    assert np.isclose(left_hand_side.value, right_hand_side.value)
+
+    assert np.isclose(omega_uh_hz.value, 69385868857.90918)
+
+    with pytest.raises(ValueError):
+        upper_hybrid_frequency(5 * u.T, n_e=-1 * u.m ** -3)
+
+    with pytest.warns(u.UnitsWarning):
+        assert upper_hybrid_frequency(1.2, 1.3) == upper_hybrid_frequency(
+            1.2 * u.T, 1.3 * u.m ** -3
+        )
+
+    with pytest.warns(u.UnitsWarning):
+        assert upper_hybrid_frequency(1.4 * u.T, 1.3) == upper_hybrid_frequency(
+            1.4, 1.3 * u.m ** -3
+        )
+
+    assert_can_handle_nparray(upper_hybrid_frequency)
diff --git a/plasmapy/formulary/tests/test_parameters.py b/plasmapy/formulary/tests/test_parameters.py
index 2a76906f..d2644050 100644
--- a/plasmapy/formulary/tests/test_parameters.py
+++ b/plasmapy/formulary/tests/test_parameters.py
@@ -7,7 +7,7 @@
 from astropy.constants import m_e, m_p
 from astropy.tests.helper import assert_quantity_allclose
 
-from plasmapy.formulary import lengths
+from plasmapy.formulary import frequencies, lengths
 from plasmapy.formulary.parameters import (
     Alfven_speed,
     betaH_,
@@ -30,6 +30,7 @@
     nD_,
     oc_,
     plasma_frequency,
+    plasma_frequency_lite,
     pmag_,
     pth_,
     rc_,
@@ -41,6 +42,7 @@
     va_,
     wc_,
     wlh_,
+    wp_,
     wuh_,
 )
 from plasmapy.particles import Particle
@@ -564,86 +566,6 @@ def test_thermal_pressure():
     assert_can_handle_nparray(thermal_pressure)
 
 
-def test_gyrofrequency():
-    r"""Test the gyrofrequency function in parameters.py."""
-
-    assert gyrofrequency(B, "e-").unit.is_equivalent(u.rad / u.s)
-
-    assert gyrofrequency(B, "e-", to_hz=True).unit.is_equivalent(u.Hz)
-
-    assert np.isclose(gyrofrequency(1 * u.T, "e-").value, 175882008784.72018)
-
-    assert np.isclose(gyrofrequency(2.4 * u.T, "e-").value, 422116821083.3284)
-
-    assert np.isclose(
-        gyrofrequency(1 * u.T, "e-", to_hz=True).value, 27992490076.528206
-    )
-
-    assert np.isclose(
-        gyrofrequency(2.4 * u.T, "e-", signed=True).value, -422116821083.3284
-    )
-
-    assert np.isclose(gyrofrequency(1 * u.G, "e-").cgs.value, 1.76e7, rtol=1e-3)
-
-    with pytest.raises(TypeError):
-        with pytest.warns(u.UnitsWarning):
-            gyrofrequency(u.m, "e-")
-
-    with pytest.raises(u.UnitTypeError):
-        gyrofrequency(u.m * 1, "e-")
-
-    assert np.isnan(gyrofrequency(B_nanarr, "e-")[-1])
-
-    # The following is a test to check that equivalencies from astropy
-    # are working.
-    omega_ce = gyrofrequency(2.2 * u.T, "e-")
-    f_ce = (omega_ce / (2 * np.pi)) / u.rad
-    f_ce_use_equiv = omega_ce.to(u.Hz, equivalencies=[(u.cy / u.s, u.Hz)])
-    assert np.isclose(f_ce.value, f_ce_use_equiv.value)
-
-    with pytest.warns(u.UnitsWarning):
-        assert gyrofrequency(5.0, "e-") == gyrofrequency(5.0 * u.T, "e-")
-
-    assert gyrofrequency(B, particle=ion).unit.is_equivalent(u.rad / u.s)
-
-    assert np.isclose(gyrofrequency(1 * u.T, particle="p").value, 95788335.834874)
-
-    assert np.isclose(gyrofrequency(2.4 * u.T, particle="p").value, 229892006.00369796)
-
-    assert np.isclose(gyrofrequency(1 * u.G, particle="p").cgs.value, 9.58e3, rtol=2e-3)
-
-    assert gyrofrequency(-5 * u.T, "p") == gyrofrequency(5 * u.T, "p")
-
-    # Case when Z=1 is assumed
-    # assert gyrofrequency(B, particle='p+') == gyrofrequency(B, particle='H-1')
-
-    assert gyrofrequency(B, particle="e+") == gyrofrequency(B, "e-")
-
-    with pytest.warns(u.UnitsWarning):
-        gyrofrequency(8, "p")
-
-    with pytest.raises(u.UnitTypeError):
-        gyrofrequency(5 * u.m, "p")
-
-    with pytest.raises(InvalidParticleError):
-        gyrofrequency(8 * u.T, particle="asdfasd")
-
-    with pytest.warns(u.UnitsWarning):
-        # TODO this should be WARNS, not RAISES. and it's probably still raised
-        assert gyrofrequency(5.0, "p") == gyrofrequency(5.0 * u.T, "p")
-
-    gyrofrequency(1 * u.T, particle="p")
-    # testing for user input Z
-    testMeth1 = gyrofrequency(1 * u.T, particle="p", Z=0.8).si.value
-    testTrue1 = 76630665.79318453
-    errStr = f"gyrofrequency() gave {testMeth1}, should be {testTrue1}."
-    assert np.isclose(testMeth1, testTrue1, atol=0.0, rtol=1e-5), errStr
-
-    assert_can_handle_nparray(gyrofrequency, kwargs={"signed": True})
-
-    assert_can_handle_nparray(gyrofrequency, kwargs={"signed": False})
-
-
 def test_Debye_number():
     r"""Test the Debye_number function in parameters.py."""
 
@@ -757,76 +679,6 @@ def test_magnetic_energy_density():
     assert_can_handle_nparray(magnetic_energy_density)
 
 
-def test_upper_hybrid_frequency():
-    r"""Test the upper_hybrid_frequency function in parameters.py."""
-
-    omega_uh = upper_hybrid_frequency(B, n_e=n_e)
-    omega_uh_hz = upper_hybrid_frequency(B, n_e=n_e, to_hz=True)
-    omega_ce = gyrofrequency(B, "e-")
-    omega_pe = plasma_frequency(n=n_e, particle="e-")
-    assert omega_ce.unit.is_equivalent(u.rad / u.s)
-    assert omega_pe.unit.is_equivalent(u.rad / u.s)
-    assert omega_uh.unit.is_equivalent(u.rad / u.s)
-    assert omega_uh_hz.unit.is_equivalent(u.Hz)
-    left_hand_side = omega_uh ** 2
-    right_hand_side = omega_ce ** 2 + omega_pe ** 2
-    assert np.isclose(left_hand_side.value, right_hand_side.value)
-
-    assert np.isclose(omega_uh_hz.value, 69385868857.90918)
-
-    with pytest.raises(ValueError):
-        upper_hybrid_frequency(5 * u.T, n_e=-1 * u.m ** -3)
-
-    with pytest.warns(u.UnitsWarning):
-        assert upper_hybrid_frequency(1.2, 1.3) == upper_hybrid_frequency(
-            1.2 * u.T, 1.3 * u.m ** -3
-        )
-
-    with pytest.warns(u.UnitsWarning):
-        assert upper_hybrid_frequency(1.4 * u.T, 1.3) == upper_hybrid_frequency(
-            1.4, 1.3 * u.m ** -3
-        )
-
-    assert_can_handle_nparray(upper_hybrid_frequency)
-
-
-def test_lower_hybrid_frequency():
-    r"""Test the lower_hybrid_frequency function in parameters.py."""
-
-    ion = "He-4 1+"
-    omega_ci = gyrofrequency(B, particle=ion)
-    omega_pi = plasma_frequency(n=n_i, particle=ion)
-    omega_ce = gyrofrequency(B, "e-")
-    omega_lh = lower_hybrid_frequency(B, n_i=n_i, ion=ion)
-    omega_lh_hz = lower_hybrid_frequency(B, n_i=n_i, ion=ion, to_hz=True)
-    assert omega_ci.unit.is_equivalent(u.rad / u.s)
-    assert omega_pi.unit.is_equivalent(u.rad / u.s)
-    assert omega_ce.unit.is_equivalent(u.rad / u.s)
-    assert omega_lh.unit.is_equivalent(u.rad / u.s)
-    left_hand_side = omega_lh ** -2
-    right_hand_side = (
-        1 / (omega_ci ** 2 + omega_pi ** 2) + omega_ci ** -1 * omega_ce ** -1
-    )
-    assert np.isclose(left_hand_side.value, right_hand_side.value)
-
-    assert np.isclose(omega_lh_hz.value, 299878691.3223296)
-
-    with pytest.raises(ValueError):
-        lower_hybrid_frequency(0.2 * u.T, n_i=5e19 * u.m ** -3, ion="asdfasd")
-
-    with pytest.raises(ValueError):
-        lower_hybrid_frequency(0.2 * u.T, n_i=-5e19 * u.m ** -3, ion="asdfasd")
-
-    with pytest.raises(ValueError):
-        lower_hybrid_frequency(np.nan * u.T, n_i=-5e19 * u.m ** -3, ion="asdfasd")
-
-    with pytest.warns(u.UnitsWarning):
-        assert lower_hybrid_frequency(1.3, 1e19, "p+") == lower_hybrid_frequency(
-            1.3 * u.T, 1e19 * u.m ** -3, "p+"
-        )
-    assert_can_handle_nparray(lower_hybrid_frequency)
-
-
 def test_Bohm_diffusion():
     r"""Test Mag_Reynolds in dimensionless.py"""
 
@@ -850,13 +702,9 @@ def test_Bohm_diffusion():
         (cs_, ion_sound_speed),
         (pth_, thermal_pressure),
         (betaH_, Hall_parameter),
-        (oc_, gyrofrequency),
-        (wc_, gyrofrequency),
         (nD_, Debye_number),
         (pmag_, magnetic_pressure),
         (ub_, magnetic_energy_density),
-        (wuh_, upper_hybrid_frequency),
-        (wlh_, lower_hybrid_frequency),
         (DB_, Bohm_diffusion),
     ],
 )
@@ -868,6 +716,7 @@ def test_parameters_aliases(alias, parent):
 @pytest.mark.parametrize(
     "kwargs, deprecated_func, parent",
     [
+        # lengths
         (
             {"T_e": 5800 * u.K, "n_e": 1e18 * u.m ** -3},
             Debye_length,
@@ -903,6 +752,49 @@ def test_parameters_aliases(alias, parent):
             rhoc_,
             lengths.rhoc_,
         ),
+        # frequencies
+        (
+            {"B": 0.4 * u.T, "particle": "He+"},
+            gyrofrequency,
+            frequencies.gyrofrequency,
+        ),
+        ({"B": 0.4 * u.T, "particle": "He+"}, oc_, frequencies.oc_),
+        ({"B": 0.4 * u.T, "particle": "He+"}, wc_, frequencies.wc_),
+        (
+            {"n": 1.0e18, "mass": 6.64556605e-27, "z_mean": 1.0},
+            plasma_frequency_lite,
+            frequencies.plasma_frequency_lite,
+        ),
+        (
+            {"n": 1.0e18 * u.m ** -3, "particle": "He+"},
+            plasma_frequency,
+            frequencies.plasma_frequency,
+        ),
+        (
+            {"n": 1.0e18 * u.m ** -3, "particle": "He+"},
+            wp_,
+            frequencies.wp_,
+        ),
+        (
+            {"B": 0.4 * u.T, "n_i": 1.0e18 * u.m ** -3, "ion": "He+"},
+            lower_hybrid_frequency,
+            frequencies.lower_hybrid_frequency,
+        ),
+        (
+            {"B": 0.4 * u.T, "n_i": 1.0e18 * u.m ** -3, "ion": "He+"},
+            wlh_,
+            frequencies.wlh_,
+        ),
+        (
+            {"B": 0.4 * u.T, "n_e": 1.0e18 * u.m ** -3},
+            upper_hybrid_frequency,
+            frequencies.upper_hybrid_frequency,
+        ),
+        (
+            {"B": 0.4 * u.T, "n_e": 1.0e18 * u.m ** -3},
+            wuh_,
+            frequencies.wuh_,
+        ),
     ],
 )
 def test_deprecated(kwargs, deprecated_func, parent):
diff --git a/plasmapy/formulary/tests/test_plasma_frequency.py b/plasmapy/formulary/tests/test_plasma_frequency.py
index 281d4b3c..04e29f5c 100644
--- a/plasmapy/formulary/tests/test_plasma_frequency.py
+++ b/plasmapy/formulary/tests/test_plasma_frequency.py
@@ -2,9 +2,9 @@
 Module for testing functionality associated with calculating the
 plasma frequency.
 
-- `~plasmapy.formulary.parameters.plasma_frequency`
-- `~plasmapy.formulary.parameters.plasma_frequency_lite`
-- `~plasmapy.formulary.parameters.wp_`
+- `~plasmapy.formulary.frequencies.plasma_frequency`
+- `~plasmapy.formulary.frequencies.plasma_frequency_lite`
+- `~plasmapy.formulary.frequencies.wp_`
 """
 import astropy.units as u
 import numpy as np
@@ -13,7 +13,7 @@
 from astropy.constants.si import m_p
 from numba.extending import is_jitted
 
-from plasmapy.formulary.parameters import plasma_frequency, plasma_frequency_lite, wp_
+from plasmapy.formulary.frequencies import plasma_frequency, plasma_frequency_lite, wp_
 from plasmapy.particles import Particle
 from plasmapy.utils.pytest_helpers import assert_can_handle_nparray
 
@@ -28,7 +28,7 @@ def test_aliases(alias, parent):
 
 class TestPlasmaFrequency:
     """
-    Test class for `plasmapy.formulary.parameters.plasma_frequency`.
+    Test class for `plasmapy.formulary.frequencies.plasma_frequency`.
 
     Note: Testing of `plasma_frequency_lite` is done in a separate test
     class.