标签: fft

C# FFT 库需要了解

我正在解决与FFT相关的问题。我遇到这样的情况,我必须将传入的数据流转发到 FFT 库函数或可以将时域数据转换为频域数据的 FFT 例程。

我需要使用 C# 中的哪个库?微软有提供这个吗?或者我需要为此使用一些第三方库?

.net fft c#-4.0 ifft

1
推荐指数
1
解决办法
1万
查看次数

傅立叶变换和滤波具有负 fft 值的频率

我正在寻找周期信号中最丰富的频率。我试图了解如果对周期信号执行傅立叶变换并过滤具有负 fft 值的频率,会得到什么。

换句话说,图 2 和图 3(见下文)的轴表示什么?我正在绘制 fft 转换信号上的频率(周期/秒) - y 轴上的负值意味着什么,我只对这些感兴趣是否有意义?

import numpy as np
import scipy

# generate data
time = scipy.linspace(0,120,4000)
acc = lambda t: 10*scipy.sin(2*pi*2.0*t) + 5*scipy.sin(2*pi*8.0*t) + 2*scipy.random.random(len(t))
signal = acc(time)

# get frequencies from decomposed fft
W =  np.fft.fftfreq(signal.size, d=time[1]-time[0])
f_signal = np.fft.fft(signal)

# filter signal
# I'm getting only the "negative" part!
cut_f_signal = f_signal.copy()
# filter noisy frequencies
cut_f_signal[(W < 8.0)] = 0
cut_f_signal[(W > 8.2)] = 0

# inverse fourier to …
Run Code Online (Sandbox Code Playgroud)

signal-processing numpy fft ifft

1
推荐指数
1
解决办法
1万
查看次数

从信号的 fft 中找到局部最大值

我正在尝试找到信号的 fft 峰值,以用于进一步分析信号。我正在使用数据的 SpanSelect 并进行 fft,表示为频谱。我真的想让绘图具有交互性,并且用户单击一个点进行进一步分析,但我没有找到一种方法可以做到这一点,所以想要一种找到局部频率峰值的方法。频谱可能如下所示:

频谱图示例

因此,我想要一种方法来返回峰值为 38 Hz 的频率。有没有办法做到这一点?

python signal-processing fft widget matplotlib

1
推荐指数
1
解决办法
3988
查看次数

RcppArmadillo ifft2 与 R 的原生 mvfft

我注意到它RcppArmadillo支持 FFT 和 2-D FFT。ifft2不幸的是, ( RcppArmadillo) 和 R 的原生数据与我的数据之间存在显着差异mvfft(..., inverse = TRUE)。这在第零个容器中特别大(这在我的应用程序中非常重要)。差异不是标量倍数。我找不到任何文档或解释这些偏差,特别是在第零个容器中。

我已经专门针对函数调用调试了该问题ifft(arma::cx_mat input)。除非存在不可预见的内存管理问题,否则这就是罪魁祸首。

示例:ifft2结果(1 列前 5 个条目):

[1] 0.513297156-0.423498014i -0.129250939+0.300225299i  
0.039722228-0.093052563i -0.007956237+0.018643534i 0.001181177-0.002768473i
Run Code Online (Sandbox Code Playgroud)

mvfft逆结果(1 列前 5 个条目):

[1] 0.278131988-0.633838170i -0.195699114+0.445980950i  
0.060070320-0.136894940i -0.011924932+0.027175865i 0.001754788-0.003999007i
Run Code Online (Sandbox Code Playgroud)

问题

  • FFT 还在开发中吗RcppArmadillo
  • 这是 FFT 变体中的常见问题(FP 或 DP 噪声之外的数值偏差)吗?
  • 是否有来自 Rcpp 或 RcppArmadillo 的“低级”函数调用来调用 R 的本机 FFT?

重现性 - 下面我尽可能地浓缩了问题并重现了问题。 更新了最少的代码 Rcpp 代码:

#include <RcppArmadillo.h>
// [[Rcpp::depends(RcppArmadillo)]]

using namespace Rcpp;
 // …
Run Code Online (Sandbox Code Playgroud)

c++ r fft rcpp

1
推荐指数
1
解决办法
515
查看次数

Android 中的吉他音高检测

我尝试在android平台上开发一个吉他游戏。

我需要进行实时音高检测以获得吉他和弦/弦的频率。

我将从麦克风获取输入,然后分析输入(输入弹奏哪种吉他弦/和弦)

我发现有两种可以使用的方法,一种是YIN,另一种是FFT。

哪种方法可以获得更好的性能和准确的结果?

android fft real-time pitch-tracking frequency-analysis

1
推荐指数
1
解决办法
2655
查看次数

python中的FFT谱图

我有 python 3.4。

我发送了一个 2MHz(例如)频率并随着时间的推移接收到空化(直到我停止测量)。我想得到一个频谱图(空化与频率),更有趣的是在次谐波 (1MHz) 频率时间内的空化频谱图。

数据保存在sdataA(=空化)和t(=测量时间)

我试图在 FFTA 中保存 fft

FFTA = np.array([])
FFTA = np.fft.fft(dataA)
FFTA = np.append(FFTA, dataA)
Run Code Online (Sandbox Code Playgroud)

我得到了实数和复数然后我只取了一半(从 0 到 1MHz)并保存了实数和复数数据。

nA = int(len(FFTA)/2)
yAre = FFTA[range(nA)].real
yAim = FFTA[range(nA)].imag
Run Code Online (Sandbox Code Playgroud)

我试图通过以下方式获取频率:

FFTAfreqs = np.fft.fftfreq(len(yAre))
Run Code Online (Sandbox Code Playgroud)

但这是完全错误的(我打印了数据print (FFTAfreqs)

我还绘制了数据,但它又是错误的:

plt.plot(t, FFTA[range(n)].real, 'b-', t, FFTA[range(n)].imag, 'r--')
plt.legend(('real', 'imaginary'))
plt.show()
Run Code Online (Sandbox Code Playgroud)

如何在次谐波 (1MHz) 频率范围内输出空化频谱图?

编辑:

数据示例:

查看“dataA”和“time”的示例:

dataA = [6.08E-04,2.78E-04,3.64E-04,3.64E-04,4.37E-04,4.09E-04,4.49E-04,4.09E-04,3.52E-04,3.24E-04,3.92E-04,3.24E-04,2.67E-04,3.24E-04,2.95E-04,2.95E-04,4.94E-04,4.09E-04,3.64E-04,3.07E-04]
time = [0.00E+00,4.96E-07,9.92E-07,1.49E-06,1.98E-06,2.48E-06,2.98E-06,3.47E-06,3.97E-06,4.46E-06,4.96E-06,5.46E-06,5.95E-06,6.45E-06,6.94E-06,7.44E-06,7.94E-06,8.43E-06,8.93E-06,9.42E-06]
Run Code Online (Sandbox Code Playgroud)

编辑二: 从@Martin 示例中,我尝试了以下代码,如果我做得对,请告诉我。

如果 dataA 和 Time 保存为 h5 文件(或我已经发布的数据)

import numpy as np
import …
Run Code Online (Sandbox Code Playgroud)

python fft

1
推荐指数
1
解决办法
2938
查看次数

如何实现基于一维 RFFT 的二维 RFFT 算法?

我正在尝试通过在每一行上执行 1D RFFT,然后在前一个结果的每一列上再次执行 1D RFFT来实现 NumPy's rfft2(),即支持二维数组的RFFT函数。

这种方法能很好地实现2D FFT功能,如前面所讨论的这个帖子上,但它似乎没有工作没有2D RFFT

这是一个实现自定义 2D FFT 函数的脚本,它遵循这个想法,使用 NumPy 的 FFT 的 1D 版本作为基础,然后将其结果与 NumPy 的实际 2D 版本进行比较:

import cmath
import numpy as np
import math

def my_fft2d(matrix):
    fft_rows = [np.fft.fft(row) for row in matrix]
    return np.transpose([np.fft.fft(row) for row in np.transpose(fft_rows)])


# initialize test data
img = np.array([[0,0,0,0], [0,1,0,0], [0,0,0,0], [0,0,0,0]])
print('img shape=', img.shape)

# perform custom FFT2D and print result
custom_result = my_fft2d(img)
print('\ncustom_result …
Run Code Online (Sandbox Code Playgroud)

python arrays numpy fft image-processing

1
推荐指数
1
解决办法
155
查看次数

numpy.fft.fft 中的“axis”参数是什么意思?

快速傅里叶变换(fft;文档)将 \'a\' 转换为其傅里叶光谱等效项:

\n\n
numpy.fft.fft(a, n=None, axis=-1, norm=None) \n
Run Code Online (Sandbox Code Playgroud)\n\n

据我了解,该参数n代表\xe2\x80\x94\xe2\x80\x94输出中有多少个样本,其中如果n小于中的样本数,则输出被裁剪a,或者如果n是则用零填充更大。

\n\n

有什么axis作用?它到底是什么意思?我还没有找到任何明确的使用示例。

\n

python numpy fft

1
推荐指数
1
解决办法
5508
查看次数

FFTW 与 Fourn 子程序结果不匹配

我正在将旧的 Fortran 代码库转换/重写为现代代码库。代码库的其中一段使用 Fourn 子程序(来自 Numerical receipies book)用于 FFT 目的。但是当我试图用 FFTW 库做那件事时,它不会产生相同的结果。我在这里很困惑。您可以在此处找到输入数据的代码: https //github.com/Koushikphy/fft_test/tree/master/notworking

使用的代码fourn


program test
    implicit none
    integer, parameter :: n=65536
    complex(kind=8) ::inp(n) = 0.0d0
    real(kind=8) :: sn, urt(2*n)
    integer :: i, ii

    sn = 1.0d0/sqrt(real(n,kind=8))

    do i=1,9070
        read(75,'(i4, 2f20.16)') ii, inp(i)
    enddo


    do i=1,n
        urt(2*i-1)= real(inp(i))
        urt(2*i) = aimag(inp(i))
    enddo

    ! forward
    call fourn(urt,[n],1,1)

    do i=1,n
        write(201,'(i4, 2f20.16)')i, urt(2*i-1), urt(2*i)
    enddo

end program test




SUBROUTINE FOURN(DATA,NN,NDIM,ISIGN)
    INTEGER ISIGN,NDIM,NN(NDIM)
! C      REAL DATA(*)
    DOUBLE PRECISION DATA(*) …
Run Code Online (Sandbox Code Playgroud)

fortran fft numerical-methods fftw fortran90

1
推荐指数
1
解决办法
139
查看次数

使用 atan2 的 FFT 的相位角 - 奇怪的行为。相移偏移?拆开?

我正在测试和执行简单的 FFT,并且我对相移感兴趣。我用正弦曲线生成 256 个样本的简单数组正弦曲线图10个周期。

我对这些样本执行 FFT 并接收复杂数据 (2x128)。然后我计算这些数据的大小,FFT 看起来像预期的那样: fft_magnitude_figure

然后我想计算 fft 复数输出的相移。我正在使用atan2。组合输出 fft_magnitude(蓝色)+ fft+phase(红色)如下所示: fft_mag_phase_figure 这几乎是我对“小”问题的期望。我知道这是包裹,但如果我想象将其展开,幅度峰值的相移读数为 36 度,我认为它应该为 0,因为我的输入正弦曲线根本没有移动。

如果我移动这个 -36 度(蓝色是同相,红色是移动的,蓝色打印仅供参考),正弦曲线看起来像这样:移位正弦图

如果我对这个红色数据执行 FFT,则幅度 + 相位输出如下所示:移位磁相相位图

因此很容易想象,展开相位在幅度峰值处将接近 0。所以有 36 度的偏移。但是,如果我准备每 256 个样本 20 个周期和 0 相移的数据,会发生什么sin_20_cyc_figure

如果我随后执行 FFT,则这是一个输出(幅度 + 相位):fft_sin_20_mag_phase_figure 我可以告诉你是否会跨越72度的峰值。所以现在有 72 度的偏移。

谁能给我提示为什么会发生这种情况?atan2() 相位输出是否与频率相关且偏移量为 2pi/周期(360 度/周期)?如何解开它并获得正确的结果(我找不到可解开的工作 C 库)。

它在 ARM Cortex-M7 处理器(嵌入式)上运行。

#define phaseShift 0
#define cycles 20

#include <arm_math.h>
#include <arm_const_structs.h>

float32_t phi = phaseShift * PI / 180; //phase shift in radians
float32_t data[256];  //input data for …
Run Code Online (Sandbox Code Playgroud)

c embedded fft phase atan2

1
推荐指数
2
解决办法
1630
查看次数