0001 http://mattt.me)
0024 import Accelerate
0025
0026
0028 public func conv(x: [Float], _ k: [Float]) -> [Float] {
0030 precondition(x.count >= k.count, "Input vector [x] must have at least as many elements as the kernel, [k]")
0031
0032 let resultSize = x.count + k.count - 1
0033 var result = [Float](count: resultSize, repeatedValue: 0)
0034 let kEnd = UnsafePointer<Float>(k).advancedBy(k.count - 1)
0035 let xPad = Repeat(count: k.count-1, repeatedValue: Float(0.0))
0036 let xPadded = xPad + x + xPad
0037 vDSP_conv(xPadded, 1, kEnd, -1, &result, 1, vDSP_Length(resultSize), vDSP_Length(k.count))
0038
0039 return result
0040 }
0041
0042 public func conv(x: [Double], _ k: [Double]) -> [Double] {
0044 precondition(x.count >= k.count, "Input vector [x] must have at least as many elements as the kernel, [k]")
0045
0046 let resultSize = x.count + k.count - 1
0047 var result = [Double](count: resultSize, repeatedValue: 0)
0048 let kEnd = UnsafePointer<Double>(k).advancedBy(k.count - 1)
0049 let xPad = Repeat(count: k.count-1, repeatedValue: Double(0.0))
0050 let xPadded = xPad + x + xPad
0051 vDSP_convD(xPadded, 1, kEnd, -1, &result, 1, vDSP_Length(resultSize), vDSP_Length(k.count))
0052
0053 return result
0054 }
0055
0056
0058 public func xcorr(x: [Float], _ y: [Float]) -> [Float] {
0061 precondition(x.count >= y.count, "Input vector [x] must have at least as many elements as [y]")
0062 var yPadded = y
0063 if x.count > y.count {
0064 let padding = Repeat(count: x.count - y.count, repeatedValue: Float(0.0))
0065 yPadded = y + padding
0066 }
0067
0068 let resultSize = x.count + yPadded.count - 1
0069 var result = [Float](count: resultSize, repeatedValue: 0)
0070 let xPad = Repeat(count: yPadded.count-1, repeatedValue: Float(0.0))
0071 let xPadded = xPad + x + xPad
0072 vDSP_conv(xPadded, 1, yPadded, 1, &result, 1, vDSP_Length(resultSize), vDSP_Length(yPadded.count))
0073
0074 return result
0075 }
0076
0077 public func xcorr(x: [Double], _ y: [Double]) -> [Double] {
0080 precondition(x.count >= y.count, "Input vector [x] must have at least as many elements as [y]")
0081 var yPadded = y
0082 if x.count > y.count {
0083 let padding = Repeat(count: x.count - y.count, repeatedValue: Double(0.0))
0084 yPadded = y + padding
0085 }
0086
0087 let resultSize = x.count + yPadded.count - 1
0088 var result = [Double](count: resultSize, repeatedValue: 0)
0089 let xPad = Repeat(count: yPadded.count-1, repeatedValue: Double(0.0))
0090 let xPadded = xPad + x + xPad
0091 vDSP_convD(xPadded, 1, yPadded, 1, &result, 1, vDSP_Length(resultSize), vDSP_Length(yPadded.count))
0092
0093 return result
0094 }
0095
0096
0098 public func xcorr(x: [Float]) -> [Float] {
0100 let resultSize = 2*x.count - 1
0101 var result = [Float](count: resultSize, repeatedValue: 0)
0102 let xPad = Repeat(count: x.count-1, repeatedValue: Float(0.0))
0103 let xPadded = xPad + x + xPad
0104 vDSP_conv(xPadded, 1, x, 1, &result, 1, vDSP_Length(resultSize), vDSP_Length(x.count))
0105
0106 return result
0107 }
0108
0109 public func xcorr(x: [Double]) -> [Double] {
0111 let resultSize = 2*x.count - 1
0112 var result = [Double](count: resultSize, repeatedValue: 0)
0113 let xPad = Repeat(count: x.count-1, repeatedValue: Double(0.0))
0114 let xPadded = xPad + x + xPad
0115 vDSP_convD(xPadded, 1, x, 1, &result, 1, vDSP_Length(resultSize), vDSP_Length(x.count))
0116
0117 return result
0118 }
0119