Python傅里叶变换助手库

一个 Python 库,可帮助进行适当缩放的傅立叶变换,包括实用函数

AI吧Python

您将在商业包、开源库、教科书和 Web 中找到的绝大多数代码根本不适合进行“适当缩放”傅里叶变换的任务,并且需要数小时的进一步调整才能获得经典和适当缩放的频谱图。你知道:正确的“幅度”,没有更多的“负频率”等。这个库是一个“开箱即用”的解决方案,还包含示例代码,让您轻松入门。

介绍

Python 3 确实需要一个现成的傅立叶变换库,用户可以直接使用它并执行傅立叶变换 (FT),并获得经典的、适当缩放的频谱与频率图。

您将在商业包、开源库、教科书和 Web 上找到的绝大多数代码根本不适合这项任务,并且需要数小时的进一步调整才能获得经典且适当缩放的频谱图。你知道:适当的“幅度”,没有更多的“负频率”等。

“傅立叶变换助手库”做了什么

FourierTransformHelperLib.py ( FTHL ) 有几个主要部分,但其基本目标是允许对真实或复杂的时间序列输入数组执行真实的傅立叶变换,从而产生可用的经典频谱输出,而无需用户进行任何进一步的调整[1]。

为许多用例提供了分步示例,展示了如何:

  1. 生成测试信号(以后可以用你的真实信号代替)。
  2. 使用包含的 32 个窗口中的任何一个,将窗口正确应用于输入数据。
  3. 执行傅里叶变换。
  4. 正确缩放傅立叶变换以校正步骤 2 中应用的窗口。
  5. 将傅里叶变换转换为幅度或 dBV 格式。
  6. 绘制真实频率的漂亮频率幅度显示(即经典频谱图)

“傅立叶变换助手库”不做什么

将原始傅立叶变换数据进行所有这些窗口化、缩放和切片,使其仅显示可用的正频率,因此不可能向后退并在 FFT 输出上执行适当的傅立叶逆变换。这是因为傅立叶变换的工作方式。变换的基本数学要求保持正向和逆变换中的总能量 [2]。在所有的窗口化、缩放等之后。这必须以某种方式退出以恢复原始信号,这根本不是这个库的目的。如上所示,该库的目的是使用最少的用户所需步骤来制作可用且正确缩放的正向变换。

引擎盖下

基本傅立叶变换 (FT) 有两种基本类型: 最通用的形式可以从任意长度的输入数据产生频谱输出。这种类型的变换称为离散傅里叶变换或 DFT。DFT 代码简单粗暴。

优点是:输入数据可以是任意长度。
缺点是:由于它是一种通用方法,因此计算量很大,并且大型输入数据集可能需要很长时间来计算。

更具体的 FT 类型称为快速傅里叶变换或 FFT。

优点是:它的计算速度比 DFT 快得多。
缺点是:输入数据长度被限制为 2 的幂。代码更难理解。

例如:在我的 4 GHz i7 Core 计算机上,一个 65536 点的 Python FFT 大约需要 1.3 毫秒。长度为 65535 的 DFT 需要 3.9 毫秒。对于输入信号长度的一点变化,这大约慢了 3 倍!

FTHL通过基于SciPy.FFT包变换的变换实现了对真实和复杂输入数据的两种傅里叶变换。SciPy.FFT会根据输入的数据长度选择合适的变换类型,所以你不用担心。请记住:如果速度是主要问题:

  1. 使您的数据集尽可能小。
  2. 使您的数据集长度为 2 的幂(即 1024、2048、4096 等)。

注意:对于本文的其余部分,当讨论适用于“FFT”或“DFT”时,广义傅里叶变换将被称为“FT”,因为它们都对等效输入数据产生相同的结果。

实部和虚部

所有 FT 实现都会自然生成与输入数组长度相同的输出数据数组。然而,输出不仅包括复数,还包括频谱本身的实部和虚部——有时称为负频率,具体取决于人们如何看待它。频谱的负频率部分通常只是实部的镜像,不包含有关频谱的任何附加信息。

FTHL 只返回频谱输出数据数组的实部(大约是输入数据数组长度的二分之一)。您将找到的所有其他库都为您提供整个实部和负频率部分作为返回值,包括 SciPy 的 FFT 模块。这对许多人来说是一个困惑的根源,它对于生成通常的真实频谱数据表示没有用处。

注意:如果您出于某种数学原因需要复数频谱的负数和实数部分,那很好,您知道为什么需要它。FTHL 旨在生成按比例缩放的经典频谱图,而不是一般的 FT 数学。

傅里叶变换缩放

您会发现大多数 FT 实现都没有针对经典频谱显示正确缩放。也就是说,变换信号的幅度随着变换点的数量而变化:N。这让大多数用户感到不安。大多数用户都希望得到适当缩放的输出,而与 FT 中使用的点数无关。

例如,如果用户输入幅度为 1 Vrms 的 10 Hz 信号,那么他们希望在频谱图中看到 10 Hz 处的 1 Vrms 峰值。FTLH 是迄今为止唯一能够正确缩放 FT 输出以使其准确的 Python 3 库,无论您如何更改变换中的点数或在输入数据上使用什么窗口。

注意:所有 FT 实现在 DC(Bin 0)和采样频率的二分之一处也有缩放差异。这些点没有虚部,只有实部。因此,在这些点上所需的缩放比例也不同。FTHL 也将适当的比例应用于 DC Bin。

使用添加的数据窗口进行缩放

您可能知道,所有 FT 都假定您输入的限时数据块在该块之前和之后都无限延长。如果您用偶数个周期转换纯正弦波,则频谱显示将是一个完美的峰值,位于输出频谱的一个 bin 中。

在现实生活中,通常不可能生成完全均匀的输入序列。任何小数周期和输出都将在整个结果频谱上涂抹。分数周期的幅度或 FT Bin 之间的峰值也将看起来低于它们的实际值。

这就是使用窗口发挥作用的地方。将一个窗口应用于输入数据,并将时间序列的开始和结束逐渐减小到零或接近零。因此,窗口的使用会诱使 FT 没有注意到输入数据中的不连续性。

通常根据四个标准选择窗口:

  1. 它们推动不需要的旁瓣的幅度有多低。
  2. 它们降低幅度不确定性的程度。
  3. 他们将数据“涂抹”到多少个相邻的 FT Bin 中。
  4. 历史原因,即“在这种情况下,每个人都使用 Window:“XYZ”。”等。

选择最佳窗口涉及许多权衡。

FTHL 的窗口化基于 Max Planck 研究所 [3] 的工作人员撰写的一篇优秀文章,包括所有常见类型的窗口,如 Welch、Hamming 和 Hann(或通常称为 Hanning)和其他 29 个非常有用但也许不太知名的窗户。还包括 17 个非常独特的平顶窗口,即使输入频率在 FT 输出箱之间,它们也能提供非常低的幅度误差。

由于对输入数据进行加窗会对其进行物理更改,因此它还可以更改生成的 FT 频谱输出幅度。FTHL 包括两个函数,允许考虑窗口增益(或损失),以便可以找到并显示正确缩放的 FT 输出。比例因子之一与离散信号的峰值有关。测量噪声时必须使用其他类型的比例因子。

在生成一组窗口系数后,将它们输入到适当的比例因子函数并计算标量比例因子数。该比例因子通过乘法应用于得到的 FT 幅度谱数据以校正幅度。

有关窗口需要和选择的更多信息,请参见参考资料 [3]。

零填充和缩放

零填充是与 FT 一起使用的一个非常有用的技巧。一种用途是将输入数据的长度四舍五入到 2 的下一个幂,以便可以将更快的 FFT 用于变换方法。例如,如果您有 1000 个点的输入数据,您可以将额外的 24 个零点数据“补零”到原始数据上,这样就可以执行 1024 点 FFT,而不是较慢的 1000 点 DFT。

零填充的另一个用途是使显示看起来更像预期的频谱显示。零填充通过在显示器上插入点来拓宽任何峰值,这使得绘图在显示屏或绘图上看起来更好。当信号不直接位于 FT 的 bin 中心时,零填充还可以对计算点之间的空间进行插值,从而减少幅度误差。

最后,零填充可以非常精细地查看窗口添加的旁瓣和边带抑制。

即使信号位于 bin 中心,零填充也会影响最终的频谱输出幅度。此处介绍的 FT 例程考虑了所需的零填充数,以便可以自动考虑适当的重新缩放因子。由于 FT 例程出于缩放原因知道所需的零填充,因此它们将请求的零数量添加到输入数据中,因此用户不必这样做。

参考文献 [4] 有更多关于零填充的信息,甚至还有更多用途。

测试数据生成

在程序开发和调试期间,要分析的真实数据并不总是可用的。FTHL 通过包括校准的正弦波发生器和校准的高斯随机噪声发生器来帮助生成逼真的测试信号,其中也可能包含噪声。

一般频谱输出操作方法

如前所述,任何 FT 的原始输出都是复数数组。除了cmath 库中 Python 3 的复数类型运算符外,FTHL 还包括几个易于使用的转换例程,用于将复数结果转换为线性、线性平方或对数幅度 dBV 格式的标量数组 [5]。

使用代码

关于傅里叶变换和 FTHL 的一般方面已经谈得够多了。下面的例子将展示它在实践中的应用是多么容易。

示例 1 – 对输入信号进行傅里叶变换的基本设置

import FourierTransformHelperLib as ft
import matplotlib.pyplot as plt

"""
FourierTransformHelperLib - Article Example 1
Generate a test signal and produce a properly scaled spectrum magnitude output
"""

# Generate a 5001 Hz Test Signal Tone with a 1.0 VRMS Amplitude
time, sig = ft.tone_sampling_points
      (amplitude=1.0, frequency=5001, sampling_frequency=20000, points=200, phase=0)

# Perform Fourier Transform and convert amplitude to magnitude
ft_sig = ft.ft_cpx(sig)
y = ft.complex_to_mag(ft_sig)

# Get X Scale of frequencies for plotting
x = ft.frequency_bins(sampling_rate=10000, signal_length=len(sig))

# Plot Spectrum
plt.figure(2)
plt.semilogy(x, y)

plt.title('Scaled Spectrum')
plt.xlabel('Frequency [Hz]')
plt.ylabel('Amplitude [Vrms]')
plt.show()

在上面的示例中,生成了一个测试信号,并执行了 FT。对结果进行缩放,频谱幅度结果可用于在数组中绘制:x 和 y。请注意生成测试信号、对其进行转换以及将复杂的 FT 输出转换为可用的幅度格式以进行绘图所需的代码行数。

文章示例 1 的图 – 图 1 的结果光谱不是您可能预期的尖峰,而是在整个图上涂抹。这是因为我故意选择输入数据以使其具有不连续性,就像所有真实数据一样。我们可以通过在进行 FT 之前对数据应用 Window 来解决这个不连续性问题。请参阅下一个示例。

示例 2 – 首先对输入数据应用一个窗口,诱使 FT 认为波形不连续性不存在

import FourierTransformHelperLib as ft
import matplotlib.pyplot as plt

"""
FourierTransformHelperLib - Article Example 2
Generate a signal, window it, and produce a properly scaled spectrum magnitude output
"""

# Generate a 5001 Hz Test Signal Tone with a 1.0 VRMS Amplitude
time, sig = ft.tone_sampling_points(amplitude=1.0, frequency=5001, 
                                    sampling_frequency=20000, points=200, phase=0)

# Get a window for the input data (Window)
wc = ft.window(window_type='fthp', points=len(sig))

# Calculate the sale factor of this generated window (Window)
w_sf = ft.window_scale_signal(window_coefficients=wc)

# Apply window to data (Window)
sig_w = sig * wc

# Plot input signal w/window
plt.figure(1)
plt.plot(time, sig_w)
plt.title('Input Signal with Window')
plt.xlabel('Time [Seconds]')
plt.ylabel('Amplitude [Volts]')

# Perform Fourier Transform and convert amplitude to magnitude
ft_sig = ft.ft_cpx(sig_w)
y = ft.complex_to_mag(ft_sig)

# Correct signal amplitude for window (Window)
y = y * w_sf

# Get X Scale for plotting
x = ft.frequency_bins(sampling_rate=10000, signal_length=len(sig))

# Plot Spectrum
plt.figure(2)
plt.semilogy(x, y)

plt.title('Scaled Spectrum')
plt.xlabel('Frequency [Hz]')
plt.ylabel('Amplitude [Vrms]')
plt.show()

如上所示,要将窗口应用于输入数据只需要多 4 行代码(这些行在上面的代码中用(Window)注释。将上面示例 2 的代码与示例 1 给出的代码进行比较。

文章示例 2 A 的图 – 在应用 FT 之前对输入数据进行窗口化时,它将类似于上图。窗口将输入数据的开始和结束减少到零或接近零。这会诱使 FT 看不到任何会涂抹所得频谱的波形不连续性。

文章示例 2 B 的图——在窗口数据的 FT 之后,光谱具有更大的动态范围并且拖尾消失了。通过使用平顶窗口,幅度现在也是正确的,因为该波形的频谱峰值实际上位于 FT 箱之间。

示例 3 – 使用窗口和零填充进行变换

import FourierTransformHelperLib as ft
import matplotlib.pyplot as plt

"""
FourierTransformHelperLib - Article Example 3
Generate a signal, window it, add zero padding to the FT,
and produce a properly scaled spectrum magnitude output
"""

# Generate a 5001 Hz Test Signal Tone with a 1.0 VRMS Amplitude
time, sig = ft.tone_sampling_points(amplitude=1.0, frequency=5001, 
                                    sampling_frequency=20000, points=200, phase=0)

# Get a window for the input data
wc = ft.window(window_type='fthp', points=len(sig))

# Calculate the sale factor of this generated window
w_sf = ft.window_scale_signal(window_coefficients=wc)

# Apply window to data
sig_w = sig * wc

# Plot input signal w/window
plt.figure(1)
plt.plot(time, sig_w)
plt.title('Input Signal with Window')
plt.xlabel('Time [Seconds]')
plt.ylabel('Amplitude [Volts]')

# Perform Fourier Transform and convert amplitude to magnitude
# Add the desired zero padding here (Padding)
ft_sig = ft.ft_cpx(sig_w, zero_padding=2000)
y = ft.complex_to_mag(ft_sig)

# Correct signal amplitude for window
y = y * w_sf

# Get X Scale (Remember that you added zero padding, so the length will be longer)
# (Padding)
x = ft.frequency_bins(sampling_rate=10000, signal_length=len(sig), 
                      zero_padding_length=2000)

# Plot Spectrum
plt.figure(2)
plt.semilogy(x, y)

plt.title('Scaled Spectrum')
plt.xlabel('Frequency [Hz]')
plt.ylabel('Amplitude [Vrms]')
plt.show()

在上面的示例3代码中,要在示例2的代码中添加零填充只需要修改两行,在上面代码的注释中标记为:(Padding)

文章示例 3 的图 – 放大 X 轴显示了由于应用了窗口和添加零填充而产生的精细光谱细节。此外,请注意,即使 FT 长度(在这种情况下)为 200 点 + 2000 零填充 = 总共 2200 点,幅度仍然是正确的。在 FTHL 中很容易进行幅度校正:在提供的 FT 函数中处理零填充,并且使用包含的窗口比例因子函数来校正应用窗口的幅度误差,如上面示例 3 的代码中所示。

回顾使用 FTHL 的基本使用步骤

FTHL 旨在使其使用保持一致。此外,可以按照相同的基本步骤分析信号和噪声信号,如下所述。

基本使用步骤——信号幅度分析
  1. 计算信号的窗口系数和窗口比例因子。
  2. 获取或生成输入数据。
  3. 将窗口应用于输入数据。
  4. 对窗口输入数据执行 FT。
  5. 转换为幅度格式。
  6. 将窗口比例因子应用于数据。

结果:信号的正确缩放频谱

基本使用步骤——噪声信号分析
  1. 计算信号的窗口系数和窗口比例因子。
  2. 获取或生成输入数据。
  3. 将窗口应用于输入数据。
  4. 对窗口输入数据执行 FT。
  5. 转换为幅度平方格式。
  6. 如果需要:逐个 bin 的平均幅度平方数据,然后对所有平均值重复步骤 2-6。
  7. 转换为幅度格式。
  8. 将窗口比例因子应用于数据。

结果:正确缩放噪声信号的频谱。

注意:参考文献 [3] 和 [4] 中概述了必须区别对待信号和噪声的原因。

测试应用和示例的描述

代码下载包括 FTHL Python 文件和八个示例测试脚本或说明书,它们展示了如何执行各种常见的转换用例。这些食谱示例应该非常有助于让 FTHL 运行以满足您的特定需求。

上面下载中提供的示例代码食谱:

示例 1 – 生成数据并产生频谱输出的基本 DFT 示例
示例 2 – 与上面的 #1 相同,但对测试数据应用一个窗口
示例 3 – 与上面的 #2 相同,但添加零填充
示例 4 – 与上面的#2,但使用最终的 dBV [4] 缩放来显示
示例 5 – 解释生成和平均噪声的正确方法
示例 6 – 添加了本底噪声以模拟真实信号的信号
示例 7 – 演示如何提取相位信息来自 FT 输出
示例 8 – 演示如何对 Complex IQ 输入数据执行完整的 FT

完整的图书馆文档

FTHL 的每个部分和功能的完整库描述如下所示。该库还实现了 Python 文档字符串注释,可在大多数 Python IDE 中启用“实时”帮助。

基本傅里叶变换核心函数

将实数或复数的输入数据数组转换为适当缩放和切片的复数输出。该参数zero_padding是可选的,如果包含,则会在输入数据长度上附加那么多零。注意:FT 必须知道添加的零的数量才能对结果进行适当的缩放。

def ft_cpx(signal, zero_padding=0):
    """
    Performs Fourier Transform on the input signal.
    Input may be real or complex.
    Input may be any length (not just powers of two).
    Uses SciPy.FFT as the base FFT implementation.

    Args:
        signal (float or Complex array): Input Signal to transform.
        zero_padding (int, optional): Additional zeros to pad the signal with
        Defaults to 0.

    Returns:
        complex: Resulting Fourier Transform as complex numbers.
        sliced to real frequencies only.
    """

频率跨度计算

此函数采用信号长度(加上您添加到 FT 的任何零填充)并计算上述 FT 函数返回的每个点的频率数组。这对于绘制绘图的 x 轴很有用。

def frequency_bins(sampling_rate, signal_length, zero_padding_length=0):
    """
    Calculates the frequency of each Fourier Transform bin.
    Useful for plotting x axis of a Fourier Transform.

    Args:
        sampling_rate (float): Sampling Frequency in Hz
        signal_length (int): Length of input signal
        zero_padding_length (int, optional): Zero padding length. Defaults to 0.

    Returns:
        float array: Array of frequencies for each of the Fourier Transform Bins.
    """

傅里叶变换格式转换

这组函数将复数 FT 输出的复数或实数数据数组输出转换为更方便的最终用户格式。下载中包含的示例食谱显示了大多数这些格式转换以及它们的使用方式。有几种输出格式可用:

def complex_to_mag(cpx_arry):
    """Convert Complex Array to Magnitude Format Array.

    Args:
        cpx_arry (complex array): Complex Input Array.

    Returns:
        float array: Magnitude Format Output.
    """
def complex_to_mag2(cpx_arry):
    """Convert Complex Array to Magnitude Squared Format Array.

    Args:
        cpx_arry (complex array): Complex Input Array.

    Returns:
        float array: Magnitude Squared Format Output.
    """

Python复制代码

def complex_to_dBV(cpx_arry):
    """Convert Complex Array to dBV Format Array.

    Args:
        cpx_arry (complex array): Complex Input Array.

    Returns:
        float array: dBV Format Output.
    """
def mag_to_mag2(mag_arry):
    """Convert Float Array to Magnitude Squared Format Array.

    Args:
        mag_arry (float array): Float Input Array.

    Returns:
        float array: Magnitude Squared Format Output.
    """

Python复制代码

def mag_to_dBV(mag_arry):
    """Convert Float Array to dBV Format Array.

    Args:
        mag_arry (float array): Magnitude Input Array.

    Returns:
        float array: dBV Format Output.
    """
def mag2_to_mag(mag2_arry):
    """Convert Magnitude Squared Float Array to Magnitude Format Array.

    Args:
        mag2_arry (float array): Magnitude Squared Input Array.

    Returns:
        float array: Magnitude Format Output.
    """
def mag2_to_dBV(mag2_arry):
    """Convert Magnitude Squared Float Array to dBV Format Array.

    Args:
        mag2_arry (float array): Magnitude Squared Input Array.

    Returns:
        float array: dBV Format Output.
    """

Python复制代码

def complex_to_phase_degrees(cpx_arry):
    """Convert Complex Number Input To Equivalent Phase Array In Degrees

    Args:
        cpx_arry (complex array): Input Array Of Complex Numbers.

    Returns:
        float array: Resulting Phase Angle In Degrees of Each Input Point
    """

Python复制代码

def complex_to_phase_radians(cpx_arry):
    """Convert Complex Number Input To Equivalent Phase Array In Radians

    Args:
        cpx_arry (complex array): Input Array Of Complex Numbers.

    Returns:
        float array: Resulting Phase Angle In Radians of Each Input Point
    """

注意:计算的相位总是在 +/-PI 间隔处不连续。为了防止这种情况,该numpy.unwrap()函数可用于尝试解开输入相位阵列以消除跳跃型不连续性。这对于干净的信号效果很好,但是随着信噪比的下降,很难从噪声中确定真正的不连续性。该函数 numpy.unwrap()是一个很好的起点,但对于真实世界的信号和低信噪比,最好的性能是使用足够的信号平均(参见上面下载中的示例 5)。

窗口系数生成

string使用所需窗口名称的值指定窗口。这与所需的点数一起传递到函数 Coefficients 中。结果是一个双精度数组,可以通过与输入数据相乘来应用,也可以由缩放因子例程之一使用来确定窗口增益或损失。窗口名称和参数在下面的附录 A 中指定,也在上面下载包中的文本文件列表中提供。

注意:不要向此处生成的窗口长度添加任何零填充。Python复制代码

def window(window_type, points):
    """
    Generates the window coefficients for the specified window type.

    Parameters
    ----------
    window_type : string
        One of the following types of window may be specified,
    points : int
        Number of points total to generate.

    Returns
    -------
    numpy array of the generated window coefficients.
    Returns empty list if error.

    """

窗口分析和缩放

给定任何一组窗口系数,这些例程将确定提供的窗口数据数组的增益或损失。窗口系数可以来自任何窗口,它们不仅限于 FTHL 提供的窗口。

window_scale_noise函数还考虑以 Hz 为单位的 bin 宽度,以校正多个或分数赫兹 bin 宽度。有关如何使用它的更多信息,请参见下载包中的示例 5。

functionnoise_bandwidth函数计算 bin [3] 中提供的窗口系数的归一化等效噪声带宽。Python复制代码

def window_scale_signal(window_coefficients):
    """
    Calculate Signal scale factor from window coefficient array.
    Designed to be applied to the "Magnitude" result.

    Args:
        window_coefficients (float array): window coefficients array

    Returns:
        float: Window scale correction factor for 'signal'
    """

Python复制代码

def window_scale_noise(window_coefficients, sampling_frequency):
    """
    Calculate Noise scale factor from window coefficient array.
    Takes into account the bin width in Hz for the final result also.
    Designed to be applied to the "Magnitude" result.

    Args:
        window_coefficients (float array): window coefficients array
        sampling_frequency (_type_): sampling frequency in Hz

    Returns:
        float: Window scale correction factor for 'signal'
    """

Python复制代码

def noise_bandwidth(window_coefficients):
    """
    Calculate Normalized, Equivalent Noise BandWidth from window coefficient array.

    Args:
        window_coefficients (float array): window coefficients array

    Returns:
        float: Equivalent Normalized Noise Bandwidth
    """  

信号产生

这些例程可用于生成用于仿真目的的测试信号。Python复制代码

def tone_cycles(amplitude, cycles, points, phase):
    """
    Generates a sine wave tone, of a specified number of whole or partial cycles.

    Parameters
    ----------
    amplitude : float
        The desired amplitude in RMS volts.
    cycles : float
        The number of whole or partial sinewave cycles to generate.
    points : int
        Number of points total to generate.
    phase : float
        Phase angle in degrees to generate. The default is 0.0.

    Returns
    -------
    numpy array of the generated tone values.

    """

Python复制代码

def tone_sampling_points(amplitude, frequency, sampling_frequency, points, phase):
    """
    Generates a sine wave tone, like it would be if sampled at a specified
    sampling frequency.

    Parameters
    ----------
    amplitude : float
        The desired amplitude in RMS volts.
    frequency : float
        Frequency in Hz of the generated tone.
    sampling_frequency : float
        Sampling frequency in Hz.
    points : int
        Number of points to generate.
    phase : float
        Phase angle in degrees to generate.

    Returns
    -------
    numpy tuple array of the time scale (x) and generated tone values (y).

    """

Python复制代码

def tone_sampling_duration(amplitude, frequency, sampling_frequency, duration, phase):
    """
    Generates a sine wave tone, like it would be if sampled at a specified
    duration.

    Parameters
    ----------
    amplitude : float
        The desired amplitude in RMS volts.
    frequency : float
        Frequency in Hz of the generated tone.
    sampling_frequency : float
        Sampling frequency in Hz.
    duration : float
        Number of seconds to generate.
    phase : float
        Phase angle in degrees to generate.

    Returns
    -------
    numpy tuple array of the time scale (x) and generated tone values (y).

    """

噪声例程根据应用要求生成校准的噪声信号。可以指定功率谱密度 (PSD),也可以使用噪声的伏特 RMS 值。

功率谱密度 (PSD) 的单位是 Vrms / rt-Hz(读作:Volts RMS Per Root-Hertz)。复制代码

def noise_psd(amplitude_psd, sampling_frequency, points):
    """
    Generates a random noise stream of a given power spectral density
    in Vrms/rt-Hz. The noise is normally distributed, with a mean of 0.0 Volts.

    Parameters
    ----------
    density : float
        The desired noise density of the generated signal Vrms/rt-Hz.
    sampling_frequency : float
        Sampling frequency in Hz.
    number : int
        Number of points total to generate.

    Returns
    -------
    numpy array of the generated noise.

    """

复制代码

def noise_rms(amplitude_rms, points):
    """
    Generates random noise stream of a given RMS voltage.
    The noise is normally distributed, with a mean of 0.0 Volts.

    Parameters
    ----------
    amplitude : float
        The desired amplitude in Volts RMS units..
    number : int
        Number of points total to generate.

    Returns
    -------
    numpy array of the generated noise.

    """

在您的项目中使用“傅立叶变换助手库”

从上面的链接下载FTHL_source_and_examples.zip 。此 zip 文件包含FourierTransformHelperLib.py源文件和所有示例脚本。

最简单的用法是将文件FourierTransformHelperLib.py放入项目目录,这样 Python 肯定会找到它。

FourierTransformHelperLib.py源文件作为“ import”添加到您的项目中,如下所示:Python复制代码

import FourierTransformHelperLib as ft
系统要求

FourierTransformHelperLib.py是使用python 3.9+以下模块开发和测试的:numpy 1.22.2scipy 1.8.0.

参考

[1] Steve Hageman,“DSPLib – .NET 4 的 FFT / DFT 傅里叶变换库”,
https: //www.codeproject.com/Articles/1107480/DSPLib-FFT-DFT-Fourier-Transform-Library-for-NET -6

[2] Parseval 定理,
https: //en.wikipedia.org/wiki/Parseval%27s_theorem

[3] G. Heinzel、A. Rudiger 和 R. Schilling,“离散傅里叶变换 (DFT) 的频谱和频谱密度估计,包括窗函数的综合列表和一些新的平顶窗。”,Max- Planck-Institut 引力物理研究所,2002 年 2 月 15 日

[4] Steve Hageman,“实践仪器工程师的傅里叶变换指南”,发表于 EDN.com,2012 年 6 月。
第 1 部分:了解 DFT 和 FFT 实现
第 2 部分:频谱泄漏和窗口
化第 3 部分:其他窗口类型,平均DFTs & more
准确测量小信号:实用指南

[5] dBV 是指 20 * 对数刻度的 dB(分贝),指的是 1 Volt RMS。例如,
10 V RMS = 20 dBV
1 V RMS = 0 dBV
0.1 V RMS = – 20 dBV
请参见:https ://en.wikipedia.org/wiki/Decibel

附录 A – 包含的窗口类型

下面是在 FTHL 中实现的窗口的列表性能参数。

有关这些窗口的更多信息,请参阅参考资料 [3]。
名称 峰值边带电平 (dB) 平坦度 (dB) 3dB BW (bins) NENBW (bins)

姓名峰值边带电平 (dB)平坦度 (dB)3dB BW(分档)NENBW(箱)
矩形或无13.33.92240.88451
韦尔奇21.32.22481.15351.2
巴特利特26.51.82421.27361.3333
汉宁或汉恩31.51.42361.43821.5
汉明42.71.75141.30081.3628
坚果346.70.8631.84961.9444
纳托尔460.90.61842.18842.31
纳托尔3A64.21.04531.68281.7721
Nuttall3B71.51.13521.61621.7037
纳托尔4A82.60.73212.01232.1253
BH92920.82561.89622.0044
Nuttall4B93.30.81181.91222.0212

表 1 – 在 FTHL 中实现的普通窗口。

姓名峰值边带电平 (dB)平坦度 (dB)3dB BW(分档)NENBW(箱)
SFT3F31.70.00823.15023.1681
SFT3M44.20.01152.91832.9452
FTNI44.40.01692.93552.9656
SFT4F44.70.00413.76183.797
SFT5F57.30.00254.2914.3412
SFT4M66.50.00673.34513.3868
FTHP70.40.00963.38463.4279
高频交易7070.40.00653.3723.4129
FTSRS76.60.01563.72743.7702
SFT5M89.90.00393.8343.8852
HFT90D90.20.00393.8323.8832
高频交易95950.00443.7593.8112
HFT116D116.80.00284.15794.2186
HFT144D144.10.00214.46974.5386
HFT169D169.50.00174.75884.8347
HFT196D196.20.00135.03085.1134
HFT223D2230.00115.35.3888
HFT248D248.40.00095.55675.6512

表 2 – FTHL 中实现的平顶窗。

HFT248D 类型的窗口将被称为:FTHL 中的“hft248d”。

:表 1 和表 2 中的列表值来自参考文献 [3]。

发表评论

邮箱地址不会被公开。 必填项已用*标注