所以它看起来像多核,所有相关的复杂功能都存在.我正在计划一个肯定会受益于并行性的软件项目.问题是我编写并发软件的经验很少.我在大学学习并很好地理解了概念和理论,但是从学校开始就没有掌握在多个处理器上运行软件的有用经验.
所以我的问题是,开始使用多处理器编程的最佳方法是什么? 我熟悉C/C++中的Linux开发和Mac OS X上的Obj-C,几乎没有Windows经验.此外,我计划的软件项目将需要FFT并且可能需要对大量数据进行浮点比较.
有OpenCL,OpenMP,MPI,POSIX线程等......我应该从哪些技术开始?
以下是我正在考虑的几个堆栈选项,但不确定他们是否会让我尝试实现我的目标:
在此先感谢您的帮助.
我有一个音频文件,我正在遍历文件,每步取512个样本,然后通过FFT.
我将数据输出为块514浮动(使用IPP的ippsFFTFwd_RToCCS_32f_I),其中实部和虚部交错.
我的问题是,一旦我拥有这些复杂数字,我该怎么办?目前我正在为每个价值做
const float realValue = buffer[(y * 2) + 0];
const float imagValue = buffer[(y * 2) + 1];
const float value = sqrt( (realValue * realValue) + (imagValue * imagValue) );
Run Code Online (Sandbox Code Playgroud)
这提供了一些稍微有用的东西,但我更倾向于在0到1的范围内获得值.上面的问题是峰值最终会回到9或更多.这意味着事情会恶化饱和,然后光谱图的其他部分几乎不会出现,尽管当我通过试听的频谱图运行音频时它们看起来非常强大.我完全承认我不是100%确定FFT返回的数据是什么(除了它代表我传入的512个样本长块的频率值).特别是我的理解是缺乏compex数字代表什么.
任何建议和帮助将不胜感激!
编辑:只是为了澄清.我的一个大问题是,如果不知道比例是什么,返回的FFT值是没有意义的.有人能指出我制定这种规模吗?
Edit2:通过执行以下操作,我得到了非常好看的结果:
size_t count2 = 0;
size_t max2 = kFFTSize + 2;
while( count2 < max2 )
{
const float realValue = buffer[(count2) + 0];
const float imagValue = buffer[(count2) + 1];
const float value = (log10f( sqrtf( (realValue * realValue) + (imagValue * …Run Code Online (Sandbox Code Playgroud) 我想在MATLAB中反转图像的傅立叶变换,但结果不是原始图像(应该是).显然有一些我不知道的实现细节导致了这个问题.这是代码:
img = imread('img.jpg');
fft = fft2(img);
inv = ifft2(fft);
imshow(inv);
Run Code Online (Sandbox Code Playgroud) 我正在尝试实现离散傅立叶变换,但它不起作用.我可能在某个地方写过一个bug,但我还没有找到它.
基于以下公式:

该函数执行第一个循环,循环遍历X0 - Xn-1 ...

public Complex[] Transform(Complex[] data, bool reverse)
{
var transformed = new Complex[data.Length];
for(var i = 0; i < data.Length; i++)
{
//I create a method to calculate a single value
transformed[i] = TransformSingle(i, data, reverse);
}
return transformed;
}
Run Code Online (Sandbox Code Playgroud)
而实际计算,这可能是错误的地方.
private Complex TransformSingle(int k, Complex[] data, bool reverse)
{
var sign = reverse ? 1.0: -1.0;
var transformed = Complex.Zero;
var argument = sign*2.0*Math.PI*k/data.Length;
for(var i = 0; i < data.Length; i++)
{
transformed …Run Code Online (Sandbox Code Playgroud) 我一直在看Apple的示例代码中的aurioTouch 2(在这里找到).在一天结束时,我想自己分析频率.现在我想了解一些正在发生的事情.我很抱歉,如果这是微不足道的,只是试图了解一些未经注释的魔术数字在某些来源中浮动.我现在的主要困惑点是:
在J.Brian Conrey在图6中的论文"The Riemann Hypothesis"中,有一个素数定理中误差项的傅立叶变换图.请参见下图中左侧的图:

在由Chris King撰写的名为Primes out of Thin Air的博客文章中,有一个Matlab程序可以绘制频谱图.请参阅帖子开头右侧的情节.可以翻译成Mathematica:
数学:
scale = 10^6;
start = 1;
fin = 50;
its = 490;
xres = 600;
y = N[Accumulate[Table[MangoldtLambda[i], {i, 1, scale}]], 10];
x = scale;
a = 1;
myspan = 800;
xres = 4000;
xx = N[Range[a, myspan, (myspan - a)/(xres - 1)]];
stpval = 10^4;
F = Range[1, xres]*0;
For[t = 1, t <= xres, t++,
For[yy=0, yy<=Log[x], yy+=1/stpval,
F[[t]] =
F[[t]] +
Sin[t*myspan/xres*yy]*(y[[Floor[Exp[yy]]]] …Run Code Online (Sandbox Code Playgroud) 我试图抓住Python的fft功能,而我偶然发现的一个奇怪的事情就是Parseval的定理似乎不适用,因为它现在给出了大约50的差异,而它应该是0.
import numpy as np
import matplotlib.pyplot as plt
import scipy.fftpack as fftpack
pi = np.pi
tdata = np.arange(5999.)/300
dt = tdata[1]-tdata[0]
datay = np.sin(pi*tdata)+2*np.sin(pi*2*tdata)
N = len(datay)
fouriery = abs(fftpack.rfft(datay))/N
freqs = fftpack.rfftfreq(len(datay), d=(tdata[1]-tdata[0]))
df = freqs[1] - freqs[0]
parceval = sum(datay**2)*dt - sum(fouriery**2)*df
print parceval
plt.plot(freqs, fouriery, 'b-')
plt.xlim(0,3)
plt.show()
Run Code Online (Sandbox Code Playgroud)
我很确定这是一个规范化因素,但我似乎无法找到它,因为我能找到的关于这个函数的所有信息都是scipy.fftpack.rfft文档.
我介绍了如何在图像和视频压缩标准中使用DCT(离散余弦变换).
但是为什么DCT仅比dft或dst等其他变换更受欢迎?
我目前正在学习离散傅里叶变换,我正在玩numpy来更好地理解它.
我试图绘制一个"sin x sin x sin"信号并获得一个带有4个非零点的干净FFT.我天真地告诉自己:"好吧,如果我用这些幅度和频率绘制一个"罪恶+罪恶+罪恶+罪恶"信号,我应该获得相同的"罪x x sin x sin"信号,对吧?
嗯...不完全是
(首先是"x"信号,第二个是"+"信号)

两者共享相同的幅度/频率,但不是相同的信号,即使我可以看到它们有一些相似之处.
好的,因为我只绘制了FFT的绝对值,我想我丢失了一些信息.
然后我绘制了两个信号的实部,虚部和绝对值:

现在,我很困惑.我该怎么办?我从数学的角度阅读有关DFT的内容.我知道复杂的价值来自单位圈.我甚至不得不了解希尔伯特的空间,以了解它是如何工作的(这很痛苦!......而且我只是划伤了表面).我只想了解这些真实/想象的情节是否在数学世界之外具有任何具体含义:
代码:
import numpy as np
import matplotlib.pyplot as plt
N = 512 # Sample count
fs = 128 # Sampling rate
st = 1.0 / fs # Sample time
t = np.arange(N) * st # Time vector
signal1 = \
1 *np.cos(2*np.pi * t) *\
2 *np.cos(2*np.pi * 4*t) *\
0.5 *np.cos(2*np.pi * 0.5*t)
signal2 = \
0.25*np.sin(2*np.pi * …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用Accelerate框架对音频文件执行FFT以查找频率.我已经从这个问题中修改了代码(可能是错误的):来自AVAudioPCMBuffer的频谱图,使用Swift中的Accelerate框架
虽然," 光谱 " 的幅度要么是' 0 ',' inf '要么是' nan ',而复杂分裂的' 真实 '和' 成像 '成分会产生相似的结果; 表明这是导致问题的原因:' magnitude = sqrt(pow(real,2)+ pow(imag,2) '.如果我错了,请纠正我,但我认为其余的代码都没问题.
为什么我会收到这些结果以及如何修复它(拆分组件应该是什么),以及我做错了什么?请记住,我对FFT和采样非常陌生,并且不知道如何为音频文件设置它,所以任何帮助都将非常感激.谢谢.
这是我正在使用的代码:
// get audio file
let fileURL:NSURL = NSBundle.mainBundle().URLForResource("foo", withExtension: "mp3")!
let audioFile = try! AVAudioFile(forReading: fileURL)
let fileFormat = audioFile.processingFormat
let frameCount = UInt32(audioFile.length)
let buffer = AVAudioPCMBuffer(PCMFormat: fileFormat, frameCapacity: frameCount)
let audioEngine = AVAudioEngine()
let playerNode = AVAudioPlayerNode()
audioMixerNode = audioEngine.mainMixerNode
let bufferSize = Int(frameCount)
let …Run Code Online (Sandbox Code Playgroud)