diff --git a/config_maker/anomalies/frequency.py b/config_maker/anomalies/frequency.py
new file mode 100644
index 0000000000000000000000000000000000000000..8df01c6e426aaaecf8aa84f74f9de60509984cfa
--- /dev/null
+++ b/config_maker/anomalies/frequency.py
@@ -0,0 +1,22 @@
+"""
+This module provides a frequency anomaly generator class
+"""
+import numpy as np
+
+from .base import BaseAnomaly
+
+
+class FrequencyAnomaly(BaseAnomaly):
+    """
+    This class generates and handles its anomaly type
+    """
+    def generate(self):
+        """
+        This function creates and returns the anomaly configuration.
+        """
+        return {
+            "kind": "FREQUENCY",
+            "length": int(self.length),
+            "position": np.random.choice(["start", "middle", "end"]),
+            "frequency": np.random.uniform(8, 18)
+        }
diff --git a/generator/anomaly/frequency.py b/generator/anomaly/frequency.py
new file mode 100644
index 0000000000000000000000000000000000000000..b2e9069045d0a0cba7aa627ae43a3afa6c1d101e
--- /dev/null
+++ b/generator/anomaly/frequency.py
@@ -0,0 +1,50 @@
+"""
+This module defines the behavior of a frequency anomaly generator.
+"""
+from typing import Tuple
+
+import numpy as np
+
+from .base import BaseAnomaly
+
+
+class FrequencyAnomaly(BaseAnomaly):
+    """
+    This class defines the behavior that every anomaly generator should have.
+    """
+    OSCILLATING_FUNCTIONS = {
+        "sin": np.sin,
+        "cos": np.cos,
+        "versine": lambda x: 1 - np.cos(x),
+        "vercosine": lambda x: 1 + np.cos(x),
+        "coversine": lambda x: 1 - np.sin(x),
+        "covercosine": lambda x: 1 + np.sin(x),
+        "haversine": lambda x: (1 - np.cos(x)) / 2,
+        "havercosine": lambda x: (1 + np.cos(x)) / 2,
+        "hacoversine": lambda x: (1 - np.sin(x)) / 2,
+        "hacovercosine": lambda x: (1 + np.sin(x)) / 2,
+    }
+
+    def inject(self) -> Tuple[np.array, np.array]:
+        start, end = self.find_anomaly_index()
+        dt = .001
+
+        res = np.zeros(len(self.data[self.idx]))
+
+        self.data[self.idx] = np.zeros(len(self.data[self.idx]))
+        self.data[self.idx, start:end] = 2 * np.pi * self.params["frequency"] * dt
+
+        for term in self.dimension:
+            func = self.OSCILLATING_FUNCTIONS[term["function"]]
+
+            # Generate testing data
+            signal = self.data[self.idx]
+            signal += 2 * np.pi * term["frequency"] * dt
+            signal = func(np.cumsum(signal))
+            signal *= term["amplitude"]
+            res += signal
+
+        self.data[self.idx] = res
+
+
+        return self.data, self.labels