标签: fft

为什么卷积结果在时域和频域中执行时有不同的长度?

我不是DSP专家,但据我所知,有两种方法可以将离散时域滤波器应用于离散时域波形.第一种是在时域中对它们进行卷积,第二种是对两者进行FFT,将两个复数谱相乘,并对结果进行IFFT.这些方法的一个关键区别是第二种方法受循环卷积的影响.

例如,如果滤波器和波形都是N点长,则第一种方法(即卷积)产生的结果是N + N-1点长,其中该响应的前半部分是滤波器填满和第二一半是过滤器排空.为了获得稳态响应,滤波器需要的点数少于要滤波的波形数.

使用第二种方法继续该示例,并假设离散时域波形数据全部是真实的(不复杂),滤波器的FFT和波形都产生N点长的FFT.将两个频谱相乘IFFT,结果产生时域结果,N点长.这里过滤器填满和空的响应在时域中相互重叠,并且没有稳态响应.这是循环卷积的效果.为了避免这种情况,通常滤波器尺寸将小于波形尺寸,并且两者都将是零填充的,以允许频率卷积的空间在两个频谱的乘积的IFFT之后及时扩展.

我的问题是,我经常看到来自知名专家/公司的文献中的工作,他们有离散(实际)时域波形(N点),他们对它进行FFT,将其乘以某个滤波器(也是N点),和IFFT后续处理的结果.我天真的想法是这个结果应该不包含稳态响应,因此应该包含过滤器填充/清空中的工件,这些工件会导致解释结果数据时出错,但我必须遗漏一些东西.在什么情况下这是一种有效的方法?

任何见解将不胜感激

signal-processing fft fftw

10
推荐指数
2
解决办法
4820
查看次数

快速傅立叶变换

我需要将两个多项式相乘,每个多项式具有小的积分系数.我需要一个C/C++中的快速FFT例程,它可以对它们进行卷积.我见过几个库,但它们似乎分布在多个文件中.重要的是我需要的代码不会太长,并且可以很容易地在单个.c/.cpp文件中使用和编译.

  1. FFT应针对实际输入进行优化,至少即使不是小整数也是如此.
  2. Radix 4实现(如果可用)也可以.
  3. 编译它应该不需要特殊的编译标志,因为程序的编译必须在我无法控制的外部环境中完成.

一个非常符合我需求的是这里.但我需要两倍的速度.

c c++ signal-processing fft dft

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

带有Accelerate框架vDSP的iPhone FFT

我在使用vDSP实现FFT时遇到了困难.我理解这个理论,但我正在寻找一个特定的代码示例.

我有来自wav文件的数据如下:

问题1.如何将音频数据输入FFT?

问题2.如何从FFT中获取输出数据?

问题3.最终目标是检查低频声音.我该怎么做?

-(OSStatus)open:(CFURLRef)inputURL{
OSStatus result = -1;

result = AudioFileOpenURL (inputURL, kAudioFileReadPermission, 0, &mAudioFile);
if (result == noErr) {
    //get  format info
    UInt32 size = sizeof(mASBD);

    result = AudioFileGetProperty(mAudioFile, kAudioFilePropertyDataFormat, &size, &mASBD);

    UInt32 dataSize = sizeof packetCount;
    result = AudioFileGetProperty(mAudioFile, kAudioFilePropertyAudioDataPacketCount, &dataSize, &packetCount);
    NSLog([NSString stringWithFormat:@"File Opened, packet Count: %d", packetCount]);

    UInt32 packetsRead = packetCount;
    UInt32 numBytesRead = -1;
    if (packetCount > 0) { 
        //allocate  buffer
        audioData = (SInt16*)malloc( 2 *packetCount);
        //read the packets
        result = AudioFileReadPackets (mAudioFile, …
Run Code Online (Sandbox Code Playgroud)

iphone signal-processing fft objective-c ios

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

快速傅立叶变换(FFT)输入和输出来分析Java中音频文件的频率?

我必须使用FFT来分析音频文件的频率.但我不知道输入和输出是什么.

如果我想绘制光谱的音频文件,是否必须使用1维,2维或3维数组?有人可以建议我在J2ME上使用FFT库吗?

java audio fft java-me

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

FFT系数问题

我是第一次从事DSP工作的软件工程师.

我成功地使用了产生频谱的FFT库.我也理解FFT如何根据其输入和输出工作,特别是两个输出数组的内容: 在此输入图像描述

现在,我的问题是我正在阅读一些新的研究报告,这些报告表明我提取:"FFT系数的能量,方差和总和".

  1. 什么是'FFT系数'?那些是上面显示的实数和虚数数组的值,(根据我的理解)对应于组成余弦和正弦波的幅度?

  2. FFT系数的"能量"是多少?这是来自统计学还是来自DSP的术语?

signal-processing fft

10
推荐指数
2
解决办法
7260
查看次数

将FFT计算卸载到嵌入式GPU是否值得?

我们正在考虑从专用数字信号处理芯片移植应用程序以在通用x86硬件上运行.该应用程序进行了大量的傅里叶变换,从简短的研究来看,FFT似乎非常适合在GPU而不是CPU上进行计算.例如,此页面有一些基准测试,其中Core 2 Quad和GF 8800 GTX在使用GPU时计算时间减少了10倍:

http://www.cv.nrao.edu/~pdemores/gpu/

但是,在我们的产品中,尺寸限制限制了我们使用PC104或Mini-ITX等小尺寸因素,因此限制了嵌入式GPU.

将计算卸载到GPU只需要在适当的PCIe总线上使用丰富的图形卡,或者甚至嵌入式GPU可以提高性能吗?

embedded gpu gpgpu fft

10
推荐指数
4
解决办法
9427
查看次数

提高FFT实现的速度

我是编程的初学者,目前正在尝试开发一个需要快速傅里叶变换实现的项目.

到目前为止,我设法实现了以下内容:

有没有人有任何替代方案和建议来提高程序的速度而不会失去准确性.

short FFTMethod::FFTcalc(short int dir,long m,double *x,double *y)
{
long n,i,i1,j,k,i2,l,l1,l2;
double c1,c2,tx,ty,t1,t2,u1,u2,z;

/* Calculate the number of points */
n = 1;
for (i=0;i<m;i++) 
    n *= 2;

/* Do the bit reversal */
i2 = n >> 1;
j = 0;
for (i=0;i<n-1;i++) {
  if (i < j) {
     tx = x[i];
     ty = y[i];
     x[i] = x[j];
     y[i] = y[j];
     x[j] = tx;
     y[j] = ty;
  }
  k = i2;
  while (k <= j) {
     j …
Run Code Online (Sandbox Code Playgroud)

c++ fft

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

计算FFT幅度的不确定度

我的Python编程问题如下:

我想创建一个测量结果数组.每个结果可以描述为正态分布,其中平均值是测量结果本身,标准偏差是其不确定性.

伪代码可以是:

x1 = N(result1, unc1)
x2 = N(result2, unc2)
...

x = array(x1, x2, ..., xN)
Run Code Online (Sandbox Code Playgroud)

比我想计算x 的FFT:

f = numpy.fft.fft(x)
Run Code Online (Sandbox Code Playgroud)

我想要的是x中包含的测量的不确定性是通过FFT计算传播的,因此f是一个幅度阵列及其不确定性,如下所示:

f = (a +/- unc(a), b +/- unc(b), ...)
Run Code Online (Sandbox Code Playgroud)

你能建议我这样做吗?

python numpy fft uncertainty

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

什么是频谱图,如何设置其参数?

我试图绘制我的时域信号的谱图:

N=5000;
phi = (rand(1,N)-0.5)*pi;
a = tan((0.5.*phi));
i = 2.*a./(1-a.^2);
plot(i);
spectrogram(i,100,1,100,1e3);
Run Code Online (Sandbox Code Playgroud)

问题是我不明白参数和应该给出的值.我正在使用这些值,我参考了MATLAB的在线文档spectrogram.我是MATLAB的新手,我只是没有理解.任何帮助将不胜感激!

matlab signal-processing fft spectrogram

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

为什么cuFFT性能会因输入重叠而受损?

我正在尝试使用cuFFT的回调功能来动态执行输入格式转换(例如,计算8位整数输入数据的FFT,而不先对输入缓冲区进行显式转换float).在我的许多应用程序中,我需要计算输入缓冲区上的重叠 FFT,如前面的SO问题所述.通常,相邻的FFT可能重叠FFT长度的1/4到1/8.

cuFFT具有类似FFTW的接口,通过函数的idist参数cufftPlanMany()显式支持.具体来说,如果我想计算大小为32768的FFT,并且在连续输入之间重叠4096个样本,我会设置idist = 32768 - 4096.这,因为它得到正确的输出感正常工作.

但是,当我以这种方式使用cuFFT时,我看到了奇怪的性能下降.我设计了一个测试,它以两种不同的方式实现这种格式转换和重叠:

  1. 明确告诉cuFFT有关输入的重叠性质:idist = nfft - overlap如上所述设置.安装负载回调函数只是没有从转换int8_tfloat根据需要提供给所述回叫缓冲指数.

  2. 不要告诉cuFFT关于输入的重叠性质; 对它说谎idist = nfft.然后,让回调函数通过计算应为每个FFT输入读取的正确索引来处理重叠.

这个GitHub要点提供了一个测试程序,该程序通过时序和等效测试实现这两种方法.为简洁起见,我没有在这里重现所有内容.该程序计算一批1024个32768点FFT,重叠4096个样本; 输入数据类型是8位整数.当我在我的机器上运行它(使用Geforce GTX 660 GPU,在Ubuntu 16.04上使用CUDA 8.0 RC)时,我得到以下结果:

executing method 1...done in 32.523 msec
executing method 2...done in 26.3281 msec
Run Code Online (Sandbox Code Playgroud)

方法2明显更快,我不指望.看一下回调函数的实现:

方法1:

template <typename T>
__device__ cufftReal convert_callback(void * inbuf, size_t fft_index, 
    void *, void *)
{
    return (cufftReal)(((const T …
Run Code Online (Sandbox Code Playgroud)

cuda fft cufft

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

标签 统计

fft ×10

signal-processing ×5

c++ ×2

audio ×1

c ×1

cuda ×1

cufft ×1

dft ×1

embedded ×1

fftw ×1

gpgpu ×1

gpu ×1

ios ×1

iphone ×1

java ×1

java-me ×1

matlab ×1

numpy ×1

objective-c ×1

python ×1

spectrogram ×1

uncertainty ×1