diff --git a/WrightTools/kit/_array.py b/WrightTools/kit/_array.py
index dec8f19..e9ae20f 100644
--- a/WrightTools/kit/_array.py
+++ b/WrightTools/kit/_array.py
@@ -243,18 +243,52 @@ def share_nans(*arrs) -> tuple:
     return tuple([a + nans for a in arrs])
 
 
-def smooth_1D(arr, n=10) -> np.ndarray:
-    """Smooth 1D data by 'running average'.
+def smooth_1D(arr, n=10, smooth_type="flat") -> np.ndarray:
+    """Smooth 1D data using a window function.
+    
+    Edge effects will be present. 
 
     Parameters
     ----------
-    n : int
-        number of points to average
+    arr : array_like
+        Input array, 1D.
+    n : int (optional)
+        Window length.
+    smooth_type : {'flat', 'hanning', 'hamming', 'bartlett', 'blackman'} (optional)
+        Type of window function to convolve data with.
+        'flat' window will produce a moving average smoothing.
+        
+    Returns
+    -------
+    array_like
+        Smoothed 1D array.
     """
-    for i in range(n, len(arr) - n):
-        window = arr[i - n : i + n].copy()
-        arr[i] = window.mean()
-    return arr
+
+    # check array input
+    if arr.ndim != 1:
+        raise wt_exceptions.DimensionalityError(1, arr.ndim)
+    if arr.size < n:
+        message = "Input array size must be larger than window size."
+        raise wt_exceptions.ValueError(message)
+    if n < 3:
+        return arr
+    # construct window array
+    if smooth_type == "flat":
+        w = np.ones(n, dtype=arr.dtype)
+    elif smooth_type == "hanning":
+        w = np.hanning(n)
+    elif smooth_type == "hamming":
+        w = np.hamming(n)
+    elif smooth_type == "bartlett":
+        w = np.bartlett(n)
+    elif smooth_type == "blackman":
+        w = np.blackman(n)
+    else:
+        message = "Given smooth_type, {0}, not available.".format(str(smooth_type))
+        raise wt_exceptions.ValueError(message)
+    # convolve reflected array with window function
+    out = np.convolve(w / w.sum(), arr, mode="same")
+    return out
 
 
 def svd(a, i=None) -> tuple:

more robust clip test
The current test for clip fails regularly, but stochastically. The function works, but is clipping all values
diff --git a/tests/dataset/clip.py b/tests/dataset/clip.py
index 705894e..c1a0a89 100644
--- a/tests/dataset/clip.py
+++ b/tests/dataset/clip.py
@@ -3,9 +3,6 @@
 
 # --- import --------------------------------------------------------------------------------------
 
-
-import random
-
 import WrightTools as wt
 from WrightTools import datasets
 
@@ -16,7 +13,7 @@ from WrightTools import datasets
 def test_w1_wa():
     p = datasets.PyCMDS.w1_wa_000
     data = wt.data.from_PyCMDS(p)
-    new_max = random.random() * 0.5 * data.array_signal.max() + data.array_signal.min()
+    new_max = 0.5 * data.array_signal.max() + data.array_signal.min()
     data.array_signal.clip(max=new_max)
     assert data.array_signal.max() <= new_max
     data.close()
diff --git a/tests/kit/smooth_1D.py b/tests/kit/smooth_1D.py
new file mode 100644
index 0000000..5e4e9b4
--- /dev/null
+++ b/tests/kit/smooth_1D.py
@@ -0,0 +1,35 @@
+"""Test kit.smooth_1D."""
+
+
+# --- import --------------------------------------------------------------------------------------
+
+
+import numpy as np
+
+import WrightTools as wt
+
+
+# --- test ----------------------------------------------------------------------------------------
+
+
+def test_basic_smoothing_functionality():
+    # create arrays
+    x = np.linspace(0, 10, 1000)
+    y = np.sin(x)
+    np.random.seed(seed=12)
+    r = np.random.rand(1000) - .5
+    yr = y + r
+    # iterate through window types
+    windows = ["flat", "hanning", "hamming", "bartlett", "blackman"]
+    for w in windows:
+        out = wt.kit.smooth_1D(yr, n=101, smooth_type=w)
+        check_arr = out - y
+        check_arr = check_arr[50:-50]  # get rid of edge effects
+        assert np.allclose(check_arr, 0, rtol=.2, atol=.2)
+
+
+# --- run -----------------------------------------------------------------------------------------
+
+
+if __name__ == "__main__":
+    test_basic_smoothing_functionality()

pip install -e .[dev]
parse_log_pytest
requirements.txt
pytest pytest-cov
apt-get update apt-get install -y libfreetype6-dev libopenblas-dev
3.9
requirements.txt
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
black==25.1.0
cfgv==3.4.0
click==8.1.8
contourpy==1.3.0
coverage==7.8.0
cycler==0.12.1
distlib==0.3.9
exceptiongroup==1.2.2
filelock==3.18.0
fonttools==4.56.0
h5py==3.13.0
identify==2.6.9
imageio==2.37.0
importlib_resources==6.5.2
iniconfig==2.1.0
kiwisolver==1.4.7
lazy_loader==0.4
matplotlib==3.9.4
mypy-extensions==1.0.0
networkx==3.2.1
nodeenv==1.9.1
numexpr==2.10.2
numpy==2.0.2
packaging==24.2
pathspec==0.12.1
pillow==11.1.0
platformdirs==4.3.7
pluggy==1.5.0
pre_commit==4.2.0
pydocstyle==6.3.0
pyparsing==3.2.3
pytest==8.3.5
pytest-cov==6.0.0
python-dateutil==2.9.0.post0
pytz==2025.2
PyYAML==6.0.2
scikit-image==0.24.0
scipy==1.13.1
six==1.17.0
snowballstemmer==2.2.0
swebench_matterhorn @ file:///swebench_matterhorn
tidy_headers==1.0.4
tifffile==2024.8.30
tomli==2.2.1
typing_extensions==4.13.0
virtualenv==20.29.3
-e git+https://github.com/wright-group/WrightTools.git@4cf127e9d431265dad6f42c48b5be05bc36e3cb7#egg=WrightTools
zipp==3.21.0

name: WrightTools
channels:
  - defaults
  - https://repo.anaconda.com/pkgs/main
  - https://repo.anaconda.com/pkgs/r
  - conda-forge
dependencies:
  - _libgcc_mutex=0.1=main
  - _openmp_mutex=5.1=1_gnu
  - ca-certificates=2025.2.25=h06a4308_0
  - ld_impl_linux-64=2.40=h12ee557_0
  - libffi=3.4.4=h6a678d5_1
  - libgcc-ng=11.2.0=h1234567_1
  - libgomp=11.2.0=h1234567_1
  - libstdcxx-ng=11.2.0=h1234567_1
  - ncurses=6.4=h6a678d5_0
  - openssl=3.0.16=h5eee18b_0
  - pip=25.0=py39h06a4308_0
  - python=3.9.21=he870216_1
  - readline=8.2=h5eee18b_0
  - setuptools=75.8.0=py39h06a4308_0
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - tzdata=2025a=h04d1e81_0
  - wheel=0.45.1=py39h06a4308_0
  - xz=5.6.4=h5eee18b_1
  - zlib=1.2.13=h5eee18b_1
  - pip:
      - black==25.1.0
      - cfgv==3.4.0
      - click==8.1.8
      - contourpy==1.3.0
      - coverage==7.8.0
      - cycler==0.12.1
      - distlib==0.3.9
      - exceptiongroup==1.2.2
      - filelock==3.18.0
      - fonttools==4.56.0
      - h5py==3.13.0
      - identify==2.6.9
      - imageio==2.37.0
      - importlib-resources==6.5.2
      - iniconfig==2.1.0
      - kiwisolver==1.4.7
      - lazy-loader==0.4
      - matplotlib==3.9.4
      - mypy-extensions==1.0.0
      - networkx==3.2.1
      - nodeenv==1.9.1
      - numexpr==2.10.2
      - numpy==2.0.2
      - packaging==24.2
      - pathspec==0.12.1
      - pillow==11.1.0
      - platformdirs==4.3.7
      - pluggy==1.5.0
      - pre-commit==4.2.0
      - pydocstyle==6.3.0
      - pyparsing==3.2.3
      - pytest==8.3.5
      - pytest-cov==6.0.0
      - python-dateutil==2.9.0.post0
      - pytz==2025.2
      - pyyaml==6.0.2
      - scikit-image==0.24.0
      - scipy==1.13.1
      - six==1.17.0
      - snowballstemmer==2.2.0
      - swebench-matterhorn==0.0.0
      - tidy-headers==1.0.4
      - tifffile==2024.8.30
      - tomli==2.2.1
      - typing-extensions==4.13.0
      - virtualenv==20.29.3
      - zipp==3.21.0
prefix: /opt/conda/envs/WrightTools

tests/kit/smooth_1D.py::test_basic_smoothing_functionality
tests/dataset/clip.py::test_w1_wa
WrightTools/kit/_array.py
WrightTools/kit/_array.py