标签: fft

带有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计算卸载到嵌入式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
查看次数

为什么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的高斯模糊

我试图使用FFT实现高斯模糊,可以在这里找到以下配方.

这意味着您可以对图像和滤波器进行傅里叶变换,将(复数)结果相乘,然后进行逆傅立叶变换.

我有一个内核K,一个7x7矩阵和一个Image I,一个512x512矩阵.

我不明白如何将K乘以I.唯一的方法是通过使K与我一样大(512x512)?

fft image-processing gaussian blur

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

如何从HTML5中的音频标签获取FFT

我想从<audio>标签中获取FFT数据,但如果没有任何语法错误,它就无法工作.看一下Web Audio API文档,我写了一个示例代码,这是我的代码:

<audio id="aud" controls="controls" src="test.mp3"></audio>

<script type="text/javascript">
var audioElement = document.getElementById("aud");
var audioContext = new webkitAudioContext();
var streamingAudioSource = audioContext.createMediaElementSource(audioElement);
var jsProcessor = audioContext.createJavaScriptNode(4096,1,1);
jsProcessor.onaudioprocess = process;
var analyser = audioContext.createAnalyser();
analyser.fftSize = 2048;

//streaming:AudioSource->jsProcessor->analyser->destination
streamingAudioSource.connect(jsProcessor);
jsProcessor.connect(analyser);
analyser.connect(audioContext.destination);
//autoplay
audioElement.play();
function process(event){
    var freqByteData = new Uint8Array(analyser.frequencyBinCount);
    analyser.getByteFrequencyData(freqByteData);
    document.getElementById("info").innerHTML=freqByteData[1];//show data in div
}
</script>
Run Code Online (Sandbox Code Playgroud)

我的Chrome版本是20.0.1096.1 dev-m,我认为它运行良好.通过process(),我试着写下freqByteData,但它显示0,并且它们都是0.它必须有我的代码有问题,我想知道如何从音频标签获取频率数据.

audio html5 fft

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

应该使用哪些FFT描述符作为实现分类或聚类算法的特征?

我有一些地理轨迹被采样来分析,我计算了空间和时间维度的数据直方图,为每个空间元素产生了一个基于时域的特征.我想执行离散FFT以将基于时域的特征转换为基于频域的特征(我认为可能更强大),然后进行一些分类或聚类算法.

但我不确定使用什么描述符作为基于频域的特征,因为有信号的振幅频谱,功率谱和相位谱,我已经阅读了一些参考文献,但仍然对其重要性感到困惑.当在基于频域的特征向量(欧几里得距离?余弦距离?高斯函数?Chi-kernel或其他?)上执行学习算法时,应使用什么距离(相似度)函数作为度量?

希望有人给我一些线索或一些我可以参考的材料,谢谢〜

编辑

感谢@DrKoch,我选择了一个具有最大L-1规范的空间元素,并log power spectrum在python中绘制它,它确实显示了一些突出的峰值,下面是我的代码和图
import numpy as np
import matplotlib.pyplot as plt
sp = np.fft.fft(signal)
freq = np.fft.fftfreq(signal.shape[-1], d = 1.) # time sloth of histogram is 1 hour
plt.plot(freq, np.log10(np.abs(sp) ** 2))
plt.show()
Run Code Online (Sandbox Code Playgroud)

对数功率谱

我有几个微不足道的问题需要确保我完全理解你的建议:

  • 在你的第二个建议中,你说"忽略所有这些价值观".

    你的意思是水平线代表阈值,它下面的所有值应该分配给零值吗?
  • "你可以搜索两个,三个最大的山峰,并使用它们的位置和可能的宽度作为'特征'进行进一步分类."

    我对"位置"和"宽度"的含义有点困惑,"位置"是指功率谱的对数值(y轴),"宽度"是指频率(x轴)?如果是这样,如何将它们组合在一起作为特征向量并比较"相似频率和类似宽度"的两个特征向量?

编辑

我换成np.fft.fftnp.fft.rfft计算正的部分和情节两个功率谱和日志功率谱.

码:
f, axarr = plt.subplot(2, sharex = True)
axarr[0].plot(freq, np.abs(sp) ** 2)
axarr[1].plot(freq, np.log10(np.abs(sp) ** 2))
plt.show()
Run Code Online (Sandbox Code Playgroud) 数字:

功率谱和对数功率谱 如果我错了,请纠正我:

我认为我应该在第一个数字中保留最后四个峰值power …

fft machine-learning similarity data-mining feature-extraction

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

Swift 2.0 Map"实例成员不能在类型上使用"

我正在尝试学习如何使用swift 2.0创建FFT但是我无法编译.map函数.

以下代码在游乐场中工作,但不在xCode内部作为swift类的成员.

我收到以下错误"实例成员'sineArraySize'不能用于'FFTAnalyser'类型

import Foundation
import Accelerate

class FFTAnalyser {
    let sineArraySize = 64 // Should be power of two for the FFT

    let frequency1 = 4.0
    let phase1 = 0.0
    let amplitude1 = 2.0

    var sineWave = (0..<sineArraySize).map {
        amplitude1 * sin(2.0 * M_PI / Double(sineArraySize) * Double($0) * frequency1 + phase1)
    }

    func plotArray<T>(arrayToPlot:Array<T>) {
        for x in arrayToPlot {
            print(x)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

任何帮助将非常感激.谢谢

xcode dictionary fft swift

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

使用fft和ifft不使用整数来改变频率

我知道我可以通过改变变量的整数改变频率偏移,但我怎样才能改变频率使用数字与小数像0.754或1.234567.456.如果我将变量'shift'更改为像5.1 这样的非整数,我得到一个错误,下标索引必须是小于2 ^ 31的正整数或来自行mag2s的逻辑= [mag2(shift + 1:end),0 (1,移位)];

示例下面的问题代码在matlab/octave中使用fft和ifft增加/减少信号的频率 与改变变量一起工作(但它只适用于整数,我需要它也可以使用小数数字).

PS:我正在使用octave 3.8.1,就像matlab一样,我知道我可以通过调整变量ya中的公式来改变频率,但是ya将是从音频源(人类语音)中获取的信号,所以它不会是一个等式.该等式仅用于保持示例简单.是的Fs很大,因为使用的信号文件长约45秒,这就是为什么我不能使用重新采样,因为我在使用时出现内存不足错误.

这是一个动画的youtube视频示例,当我使用测试方程ya = .5*sin(2*pi*1*t)+.2*cos(2*pi*3*t)时,我想要得到的内容我想要让发生,如果我改变的变量转变,从(0:0.1:5)youtu.be/pf25Gw6iS1U请记住,雅将导入音频信号,所以我不会有一个公式可以轻松地调整

clear all,clf

Fs = 2000000;% Sampling frequency
t=linspace(0,1,Fs);

%1a create signal
ya = .5*sin(2*pi*2*t); 

%2a create frequency domain
ya_fft = fft(ya);

mag = abs(ya_fft);
phase = unwrap(angle(ya_fft));
ya_newifft=ifft(mag.*exp(i*phase));

% ----- changes start here ----- %

shift …
Run Code Online (Sandbox Code Playgroud)

matlab signal-processing fft octave ifft

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

在Python中将FFT绘制为一组正弦波?

我在演示中看到有人这样做,但我很难重现他能够做到的事情。这是他演讲中的一张幻灯片:

通过 FFT 进行正弦波分解

很酷。他使用 FFT 分解数据集,然后绘制 FFT 指定的适当正弦波。

因此,为了重现他所做的事情,我创建了一系列对应于 2 个正弦波组合的点:

import matplotlib.pyplot as plt
import numpy as np
%matplotlib inline

x = np.arange(0, 10, 0.01)
x2 = np.arange(0, 20, 0.02)
sin1 = np.sin(x)
sin2 = np.sin(x2)
x2 /= 2
sin3 = sin1 + sin2
plt.plot(x, sin3)
plt.show()
Run Code Online (Sandbox Code Playgroud)

合成波

现在我想将这个波(或者更确切地说,这些点暗示的波)分解回原来的 2 个正弦波:

# goal: sin3 -> sin1, sin2
# sin3 
array([ 0.00000000e+00,  2.99985000e-02,  ... 3.68998236e-01])
# sin1 
array([ 0.        ,  0.00999983,  0.01999867,  ... -0.53560333])
# sin2 
array([ 0.        ,  0.01999867,  0.03998933, ... 0.90460157]) …
Run Code Online (Sandbox Code Playgroud)

python numpy fft sine-wave

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