我在使用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) 我们正在考虑从专用数字信号处理芯片移植应用程序以在通用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可以提高性能吗?
我是编程的初学者,目前正在尝试开发一个需要快速傅里叶变换实现的项目.
到目前为止,我设法实现了以下内容:
有没有人有任何替代方案和建议来提高程序的速度而不会失去准确性.
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) 我正在尝试使用cuFFT的回调功能来动态执行输入格式转换(例如,计算8位整数输入数据的FFT,而不先对输入缓冲区进行显式转换float).在我的许多应用程序中,我需要计算输入缓冲区上的重叠 FFT,如前面的SO问题所述.通常,相邻的FFT可能重叠FFT长度的1/4到1/8.
cuFFT具有类似FFTW的接口,通过函数的idist参数cufftPlanMany()显式支持.具体来说,如果我想计算大小为32768的FFT,并且在连续输入之间重叠4096个样本,我会设置idist = 32768 - 4096.这不,因为它得到正确的输出感正常工作.
但是,当我以这种方式使用cuFFT时,我看到了奇怪的性能下降.我设计了一个测试,它以两种不同的方式实现这种格式转换和重叠:
明确告诉cuFFT有关输入的重叠性质:idist = nfft - overlap如上所述设置.安装负载回调函数只是没有从转换int8_t到float根据需要提供给所述回叫缓冲指数.
不要告诉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) 我试图使用FFT实现高斯模糊,可以在这里找到以下配方.
这意味着您可以对图像和滤波器进行傅里叶变换,将(复数)结果相乘,然后进行逆傅立叶变换.
我有一个内核K,一个7x7矩阵和一个Image I,一个512x512矩阵.
我不明白如何将K乘以I.唯一的方法是通过使K与我一样大(512x512)?
我想从<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.它必须有我的代码有问题,我想知道如何从音频标签获取频率数据.
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.fft与np.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
我正在尝试学习如何使用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)
任何帮助将非常感激.谢谢
我知道我可以通过改变变量的整数改变频率偏移,但我怎样才能改变频率使用数字与小数像0.754或1.2345或67.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) 我在演示中看到有人这样做,但我很难重现他能够做到的事情。这是他演讲中的一张幻灯片:
很酷。他使用 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)