我正在解决与FFT相关的问题。我遇到这样的情况,我必须将传入的数据流转发到 FFT 库函数或可以将时域数据转换为频域数据的 FFT 例程。
我需要使用 C# 中的哪个库?微软有提供这个吗?或者我需要为此使用一些第三方库?
我正在寻找周期信号中最丰富的频率。我试图了解如果对周期信号执行傅立叶变换并过滤具有负 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) 我正在尝试找到信号的 fft 峰值,以用于进一步分析信号。我正在使用数据的 SpanSelect 并进行 fft,表示为频谱。我真的想让绘图具有交互性,并且用户单击一个点进行进一步分析,但我没有找到一种方法可以做到这一点,所以想要一种找到局部频率峰值的方法。频谱可能如下所示:

因此,我想要一种方法来返回峰值为 38 Hz 的频率。有没有办法做到这一点?
我注意到它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)
问题
RcppArmadillo?重现性 - 下面我尽可能地浓缩了问题并重现了问题。 更新了最少的代码 Rcpp 代码:
#include <RcppArmadillo.h>
// [[Rcpp::depends(RcppArmadillo)]]
using namespace Rcpp;
// …Run Code Online (Sandbox Code Playgroud) 我尝试在android平台上开发一个吉他游戏。
我需要进行实时音高检测以获得吉他和弦/弦的频率。
我将从麦克风获取输入,然后分析输入(输入弹奏哪种吉他弦/和弦)
我发现有两种可以使用的方法,一种是YIN,另一种是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) 我正在尝试通过在每一行上执行 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) 快速傅里叶变换(fft;文档)将 \'a\' 转换为其傅里叶光谱等效项:
numpy.fft.fft(a, n=None, axis=-1, norm=None) \nRun Code Online (Sandbox Code Playgroud)\n\n据我了解,该参数n代表\xe2\x80\x94\xe2\x80\x94输出中有多少个样本,其中如果n小于中的样本数,则输出被裁剪a,或者如果n是则用零填充更大。
有什么axis作用?它到底是什么意思?我还没有找到任何明确的使用示例。
我正在将旧的 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) 我正在测试和执行简单的 FFT,并且我对相移感兴趣。我用正弦曲线生成 256 个样本的简单数组
10个周期。
我对这些样本执行 FFT 并接收复杂数据 (2x128)。然后我计算这些数据的大小,FFT 看起来像预期的那样:

然后我想计算 fft 复数输出的相移。我正在使用atan2。组合输出 fft_magnitude(蓝色)+ fft+phase(红色)如下所示:
这几乎是我对“小”问题的期望。我知道这是包裹,但如果我想象将其展开,幅度峰值的相移读数为 36 度,我认为它应该为 0,因为我的输入正弦曲线根本没有移动。
如果我移动这个 -36 度(蓝色是同相,红色是移动的,蓝色打印仅供参考),正弦曲线看起来像这样:
如果我对这个红色数据执行 FFT,则幅度 + 相位输出如下所示:
因此很容易想象,展开相位在幅度峰值处将接近 0。所以有 36 度的偏移。但是,如果我准备每 256 个样本 20 个周期和 0 相移的数据,会发生什么
如果我随后执行 FFT,则这是一个输出(幅度 + 相位):
我可以告诉你是否会跨越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)