快速傅里叶变换的简称,是快速计算离散傅里叶变换的一组算法中的任何一种。
我正在尝试生成功率谱为 P(k) = 1/k^2 的 3D 高斯随机场,然后测量生成的场的功率谱作为一致性检查(测量的功率谱.. .
我正在使用 arduino nano、驻极体电容麦克风和 8X32 矩阵创建声音可视化器,但我不断收到相同的错误。 这是代码: #包括 #包括<
这是我的代码,但心率值不准确。 请帮助我如何改进它。 正常bpm应该是60-100。 我正在尝试通过绿色通道提取 hr,然后计算 fft
“我正在寻求利用离散傅里叶变换 (DFT) 来解决静电问题,但我遇到了零频率的问题。为了说明这一点,我尝试了一个基本的 p...
如何理解我的 RICM 细胞粘附显微镜图像的 FFT(傅立叶变换)?
我正在尝试对图像进行分割,在处理图像时,我遇到在图像 J 中进行 FFT 并删除中心频率可以给你细胞的边缘。 但我无法理解...
如何在 Python 中创建一个实时进程,从摄像头获取实时反馈并绘制其 RGB 光谱?
我正在开发一个简单的程序,该程序从 LuCam 模型获取数据,然后在对其执行 fft 后绘制结果光谱。然后我想将这些值划分为各自的 RGB v...
我正在尝试在任意点插值函数,并且我在切比雪夫极点处有函数值。我使用快速傅立叶变换的实数值来计算切比雪夫
将 numpy 导入为 np 将 matplotlib.pyplot 导入为 plt # 采样率 dt = 0.01 # 0.01초간격 # rpm 原始数据 data1 = np.array([735, 743, 744, 739, 734, 752, 750, 745, 739, 751, 751, 745, 740, 757, 755...
我想对 numpy 数组 Y 进行数值计算 FFT。为了进行测试,我使用高斯函数 Y = exp(-x^2)。 (符号)傅立叶变换为 Y' = 常数 * exp(-k^2/4)。 导入numpy X =
我有以下 FFT 图: 我不知道这是否可行,但我想从 MATLAB 中的 FFT 图找到传递函数。 这是我到目前为止所做的: np = 2; % 数量...
基于另一个问题的非常有用的答案,我编写了一个函数来计算随机变量之和的密度函数。该函数采用两个密度函数 f1 和 f2,然后
我正在使用 pythonnet 将 Python 代码集成到我的 C# 程序中。具体来说,我尝试在复杂数组上应用快速傅里叶变换(FFT)。虽然代码在 Python 中完美运行,但我
我正在尝试理解傅里叶变换。我希望能够使用傅立叶变换提取时间序列数据集中的主导周期。 我几乎已经完成了,除了我无法得到 r...
我正在尝试使用 FFTW 进行实值二维傅里叶变换。我的数据存储在动态大小的特征矩阵中。这是我写的包装类: FFT2D.h: #包括 FFT2 类...
在 Python 中使用 FFT 和 IFFT 在偶数点采样时,离散函数变得复杂,同时自由传播实数函数
我的代码涉及使用傅里叶变换和傅里叶逆变换传播实函数。具体来说,该函数演化为 ∂ψ(z,t)/∂t - v ∂ψ(z,t)/∂z =0 我通过Fou解决了这个问题...
我编写了以下类来计算 3d 向量列表的自相关。 我从这个链接中获取了公式 公共静态类 AutocorrVec3 { 私有静态双 C(int t, List 我编写了以下类来计算 3d 向量列表的自相关。 我从这个链接获取了公式 public static class AutocorrVec3 { private static double C(int t, List<Vec3> vectors) { int n = vectors.Count; if (t >= n || t < 0) throw new ArgumentException("Invalid value for t. It must be between 0 and n-1."); double sum = 0; for (int i = 0; i < n - t; i++) { sum += vectors[i].Dot(vectors[i + t]); } return sum / (n - t); } public static (List<double> taus, List<double> autocorrs) GetAutoCorrelationPoints(List<Vec3> vectors, int maxLag) { var tValues = new List<double>(); var cResults = new List<double>(); double c0 = C(0, vectors); // This is the normalization factor Console.WriteLine($"Normalization factor: {c0}"); for (int lag = 0; lag <= maxLag; lag++) // Start from 0 to include the autocorrelation at lag 0 { try { double cValue = C(lag, vectors); Console.WriteLine($"Lag={lag}, Raw Autocorr={cValue}, Normalized Autocorr={cValue / c0}"); tValues.Add(lag); cResults.Add(cValue / c0); // Normalization is done here } catch (ArgumentException ex) { Console.WriteLine(ex.Message); break; } } return (tValues, cResults); } } 问题是,GetAutoCorrelationPoints()非常慢。例如,我需要转换 24 个文件,每个文件包含 10000000 个 3d 矢量。 24小时后,连一个数据文件都无法完成计算。 在这种情况下我该如何应用FFT? 我想用MathNet.Numerics。 using System; using System.Collections.Generic; using System.Numerics; using MathNet.Numerics.IntegralTransforms; namespace FourierTransformCSharp { public static class AutocorrVec3 { // Compute the autocorrelation of a time series using FFT public static double[] ComputeAutocorrelationUsingFFT(List<Vec3> vectors) { int n = vectors.Count; // Create a zero-padded list double the size of the original for FFT var paddedVectors = new Complex[2 * n]; for (int i = 0; i < n; i++) { // Convert vector to complex number with magnitude as real part paddedVectors[i] = new Complex(vectors[i].Magnitude(), 0); } for (int i = n; i < 2 * n; i++) // Zero padding { paddedVectors[i] = Complex.Zero; } // Perform FFT on the zero-padded list Fourier.Forward(paddedVectors, FourierOptions.Default); // Compute power spectrum (magnitude squared) for (int i = 0; i < paddedVectors.Length; i++) { var magnitude = paddedVectors[i].Magnitude; paddedVectors[i] = new Complex(magnitude * magnitude, 0); } // Perform Inverse FFT to obtain the autocorrelation function Fourier.Inverse(paddedVectors, FourierOptions.Default); // Extract the real parts as the autocorrelation result var autocorr = new double[n]; for (int i = 0; i < n; i++) { autocorr[i] = paddedVectors[i].Real; } // Normalize the autocorrelation result var normalizationFactor = autocorr[0]; for (int i = 0; i < n; i++) { autocorr[i] /= normalizationFactor; } return autocorr; } // Calculate autocorrelation of vector time series at lag t public static double C(int t, List<Vec3> vectors) { double[] autocorr = ComputeAutocorrelationUsingFFT(vectors); return autocorr[t]; } // Get autocorrelation values for lags from 0 to maxLag public static (List<int> taus, List<double> autocorrs) GetAutoCorrelationPoints(List<Vec3> vectors, int maxLag) { List<int> taus = new List<int>(); List<double> autocorrs = new List<double>(); double[] autocorr = ComputeAutocorrelationUsingFFT(vectors); for (int t = 0; t <= maxLag && t < vectors.Count; t++) { taus.Add(t); autocorrs.Add(autocorr[t]); } return (taus, autocorrs); } // Parallel computation is unnecessary as FFT-based autocorrelation is already fast // Use GetAutoCorrelationPoints for parallel computation } public class Vec3 { public double X { get; } public double Y { get; } public double Z { get; } public Vec3(double x, double y, double z) { X = x; Y = y; Z = z; } // Compute the magnitude of the vector public double Magnitude() { return Math.Sqrt(X * X + Y * Y + Z * Z); } } public class AutocorrelationDriver { public static void Main() { // Define your list of 3D vectors List<Vec3> vectors = new List<Vec3> { new Vec3(1, 1, 1), new Vec3(2, 2, 2), new Vec3(3, 3, 3), new Vec3(4, 4, 4), new Vec3(5, 5, 5) }; // Compute the autocorrelation var aurocorr = AutocorrVec3.GetAutoCorrelationPoints(vectors, vectors.Count - 1); // Output the results Console.WriteLine("Lag\tAutocorrelation"); for (int i = 0; i < aurocorr.taus.Count; i++) { Console.WriteLine($"{aurocorr.taus[i]}\t{aurocorr.autocorrs[i]}"); } Console.ReadKey(); } } } 上面的代码是我写的。 正确的输出如下: 但是,我编写的代码给出了以下输出: Lag Autocorrelation 0 1 1 0.727272727272727 2 0.472727272727273 3 0.254545454545455 4 0.0909090909090911 如何修复我的代码? 就目前而言,基于 FFT 的计算实际上没有任何问题。您记得在所有正确的位置进行零填充(做得很好),它给出了我对您的测试数据所期望的答案。 这两个代码之间的差异是因为您忘记了通过贡献滞后分量 1/(n-t) 的数量来标准化 FFT 计算的输出。 应用该校正进行 FFT 相关性计算可得到与玩具测试数据上的普通方法完全相同的答案。 我不太确定将相关函数应用于矢量大小的优点,但这完全是另一回事。这是示例数据的表格。 数据 滞后 sum(a(i).a(i+t)) 规范 /(n-t) 范数 C(t,v5) 1 0 55 1 0.2 1 2 1 40 0.727272727 0.181818182 0.909090909 3 2 26 0.472727273 0.157575758 0.787878788 4 3 14 0.254545455 0.127272727 0.636363636 5 4 5 0.090909091 0.090909091 0.454545455 您可以通过一种方法来进一步优化它,方法是返回向量中的幂,而不是返回magnitude = sqrt(X.X+Y.Y+Z.Z),然后在返回“X.X+Y.Y+”时对其进行平方Z.Z" 它已准备好用于计算功率谱。我真的不确定这个计算有什么物理解释。 顺便说一句,通过使用 FFT 的实数到复数共轭对称版本,您几乎可以将速度提高一倍并将内存需求减半。这避免了将真实数据提升为零虚部的复杂数据。首先尝试“按原样”,因为对于较大的 N,Nlog N 比 N^2 小很多。 但是速度提高两倍可能仍然值得付出额外的努力。
我有以下1.2Hz/9Hz/15Hz信号 将 numpy 导入为 np 总时间 = 5 采样频率 = 100 t = np.linspace(0, 总时间, 总时间 * 采样频率, 端点=False) 信号 = np.s...
我有以下1Hz/10Hz信号 将 numpy 导入为 np 总时间 = 5 采样频率 = 200 t = np.linspace(0, 总时间, 总时间 * 采样频率) 信号 = np.sin(2 * np.pi * 1 * t)...
使用 np.fft.fft2 和 cv2.dft 再现相位谱。为什么结果不相似?
另一个问题是询问使用 cv2.dft 时获取幅度谱和相位谱的正确方法。 我的答案仅限于 numpy 方法,然后我认为使用 OpenCV 来实现此目的