Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift中的DFT结果与MATLAB中的结果不同_Swift_Matlab_Fft_Accelerate Framework_Vdsp - Fatal编程技术网

Swift中的DFT结果与MATLAB中的结果不同

Swift中的DFT结果与MATLAB中的结果不同,swift,matlab,fft,accelerate-framework,vdsp,Swift,Matlab,Fft,Accelerate Framework,Vdsp,与Matlab输出相比,Swift代码输出完全不同且无法识别,无论应用了何种比例因子,也不管是否应用了实到复或复到复转换: 你知道这是为什么吗?2次FFT的长度不同,因此,结果当然不匹配。您还将不同数量的数据传递给2个FFT 打印出FFT长度和输入数据向量以调试代码。在比较结果之前,确保输入匹配 此外,苹果的Accelerate/vDSP FFT可以使用除2次幂以外的长度(也允许使用系数为3或5的长度) 另外,请注意,Matlab索引数组从1开始,而不是0,这在C和Swift函数中更为典型。事

与Matlab输出相比,Swift代码输出完全不同且无法识别,无论应用了何种比例因子,也不管是否应用了实到复或复到复转换:


你知道这是为什么吗?

2次FFT的长度不同,因此,结果当然不匹配。您还将不同数量的数据传递给2个FFT

打印出FFT长度和输入数据向量以调试代码。在比较结果之前,确保输入匹配

此外,苹果的Accelerate/vDSP FFT可以使用除2次幂以外的长度(也允许使用系数为3或5的长度)


另外,请注意,Matlab索引数组从1开始,而不是0,这在C和Swift函数中更为典型。

事实上,FFT结果不匹配的问题是由于输入大小不匹配。将输入限制为2的特定幂倍数极大地限制了加速框架中FFT的使用。一个建议是用0填充输入,直到它具有适当的长度。无论是用0填充输入还是截断输入,使其大小为2的幂的特定倍数,加速框架的结果都将不同于MATLAB等程序的结果。解决方法是执行Martin R指定链接中提到的chirp-z变换。chirp-z变换本身产生与FFT相同的结果,并且可以在任意大小的输入上执行。

您的输入数据有1000个数字,但其中只有512个被传递到DSP函数中,其余的488个值被忽略。那怎么行?你什么意思?那怎么行?Swift中的FFT函数需要2的幂,因此需要512使用1024进行尝试。我不熟悉MATLAB,但在MATLAB代码中,似乎1000个元素的数据集没有被截断为512。所以你不能期望得到相同的结果。据我所知,Accelerate框架中的FFT函数只能处理2倍于1、3、5或15的样本大小,而MATLAB可以处理任意大小的样本。相关:,来自MSE。正如您在上一篇参考文献中所看到的,将“任意大小”的情况转换为“二次幂”的情况并非易事,您不能简单地用零填充样本。
import Cocoa
import Accelerate

let filePath = Bundle.main.path(forResource: "sinusoid", ofType: "txt")
let contentData = FileManager.default.contents(atPath: filePath!)
var content = NSString(data: contentData!, encoding: String.Encoding.utf8.rawValue) as? String

var idx = content?.characters.index(of: "\n")
idx = content?.index(after: idx!)

repeat {
    //let fromIndex = index(from: )
    content = content?.substring(from: idx!)
    idx = content?.characters.index(of: "\n")
    idx = content?.index(after: idx!)
} while content!.characters.contains("%")

let regex = try? NSRegularExpression(pattern: "[ ]+", options:[])

let delimiter = ","
var modifiedString = regex?.stringByReplacingMatches(in: content!, options: [], range: NSRange(location: 0, length: (content! as NSString).length), withTemplate: delimiter)

let lines = modifiedString?.components(separatedBy: "\n")

var s = [Double]()

for var line in lines! {
    if !line.isEmpty {
        let data = line.components(separatedBy: ",")
        s.append(Double(data[1])!)
    }
}

let length = vDSP_Length(pow(2, floor(log2(Float(s.count)))))
let L = Int(length)

// zrop or zop? 
// zrop covers real to complex, and zop covers complex
// length must be a power of 2 or specific multiples of powers of 2 if size is at least 4
let setup = vDSP_DFT_zrop_CreateSetupD(nil, length, vDSP_DFT_Direction.FORWARD)

var inputReal = UnsafeMutablePointer<Double>.allocate(capacity: L)
var inputImaginary = UnsafeMutablePointer<Double>.allocate(capacity: L)
var outputReal = UnsafeMutablePointer<Double>.allocate(capacity: L)
var outputImaginary = UnsafeMutablePointer<Double>.allocate(capacity: L)

for i in 0..<L {
    inputReal[i] = s[i]
    inputImaginary[i] = 0.0
}

vDSP_DFT_ExecuteD(setup!, inputReal, inputImaginary, outputReal, outputImaginary)

for i in 0..<L {
    print("\(outputReal[i]) + \(outputImaginary[i])i")
}
clear all; close all; clc;
data = load('sinusoid.txt');
S = data(:,2);
Fs = 1000;
Y = fft(S);
L = length(S);
P2 = abs(Y/L);
P1 = P2(1:L/2+1);
P1(2:end-1) = 2*P1(2:end-1);
f = Fs*(0:(L/2))/L;
plot(f,P1)
title('Single-Sided Amplitude Spectrum of X(t)')
xlabel('f (Hz)')
ylabel('|P1(f)|')