zurück Ich verwende vDSP_conv
, um Autokorrelation durchzuführen. Meistens funktioniert es gut, aber manchmal füllt es das Ausgangs-Array mit NaNs.vDSP_conv gibt gelegentlich NANs
Der Code:
func corr_test() {
var pass = 0
var x = [Float]()
for i in 0..<2000 {
x.append(Float(i))
}
while true {
print("pass \(pass)")
let corr = autocorr(x)
if corr[1].isNaN {
print("!!!")
}
pass += 1
}
}
func autocorr(a: [Float]) -> [Float] {
let resultLen = a.count * 2 + 1
let padding = [Float].init(count: a.count, repeatedValue: 0.0)
let a_pad = padding + a + padding
var result = [Float].init(count: resultLen, repeatedValue: 0.0)
vDSP_conv(a_pad, 1, a_pad, 1, &result, 1, UInt(resultLen), UInt(a_pad.count))
return result
}
Der Ausgang:
pass ...
pass 169
pass 170
pass 171
(lldb) p corr
([Float]) $R0 = 4001 values {
[0] = 2.66466637E+9
[1] = NaN
[2] = NaN
[3] = NaN
[4] = NaN
...
Ich bin nicht sicher, was hier los ist. Ich denke, dass ich die 0-Padding richtig handle, denn wenn ich es nicht wäre, würde ich nicht 99% der Zeit korrekte Ergebnisse bekommen.
Ideen? Gracias.
Die Dokumente sagen, dass Vektor A "muss mindestens N + P - 1." N ist die Länge des Ausgabevektors und P ist die Länge des Filtervektors, daher ist die Art, wie ich das Array paddle, wahrscheinlich falsch, aber ich bin mir immer noch nicht sicher, was die richtige Methode ist. –