| // RUN: %target-run-simple-swift |
| // REQUIRES: executable_test |
| |
| // REQUIRES: rdar50301438 |
| // REQUIRES: objc_interop |
| // UNSUPPORTED: OS=watchos |
| |
| import StdlibUnittest |
| import Accelerate |
| |
| var Accelerate_vDSPFillClearGenerateTests = TestSuite("Accelerate_vDSPFillClearGenerate") |
| |
| //===----------------------------------------------------------------------===// |
| // |
| // vDSP vector fill, clear, and generation tests |
| // |
| //===----------------------------------------------------------------------===// |
| |
| if #available(macOS 10.15, iOS 13.0, tvOS 13.0, watchOS 6.0, *) { |
| |
| let count = 256 |
| let n = vDSP_Length(256) |
| |
| Accelerate_vDSPFillClearGenerateTests.test("vDSP/SinglePrecisionFill") { |
| var result = [Float](repeating: 1, count: count) |
| var legacyResult = [Float](repeating: -1, count: count) |
| |
| vDSP.fill(&result, |
| with: 999) |
| |
| vDSP_vfill([999], |
| &legacyResult, 1, |
| n) |
| |
| expectTrue(result.elementsEqual(legacyResult)) |
| } |
| |
| Accelerate_vDSPFillClearGenerateTests.test("vDSP/SinglePrecisionClear") { |
| var result = [Float](repeating: 1, count: count) |
| var legacyResult = [Float](repeating: -1, count: count) |
| |
| vDSP.clear(&result) |
| |
| vDSP_vclr(&legacyResult, 1, |
| n) |
| |
| expectTrue(result.elementsEqual(legacyResult)) |
| } |
| |
| Accelerate_vDSPFillClearGenerateTests.test("vDSP/DoublePrecisionFill") { |
| var result = [Double](repeating: 1, count: count) |
| var legacyResult = [Double](repeating: -1, count: count) |
| |
| vDSP.fill(&result, |
| with: 999) |
| |
| vDSP_vfillD([999], |
| &legacyResult, 1, |
| n) |
| |
| expectTrue(result.elementsEqual(legacyResult)) |
| } |
| |
| Accelerate_vDSPFillClearGenerateTests.test("vDSP/DoublePrecisionClear") { |
| var result = [Double](repeating: 1, count: count) |
| var legacyResult = [Double](repeating: -1, count: count) |
| |
| vDSP.clear(&result) |
| |
| vDSP_vclrD(&legacyResult, 1, |
| n) |
| |
| expectTrue(result.elementsEqual(legacyResult)) |
| } |
| |
| Accelerate_vDSPFillClearGenerateTests.test("vDSP/SinglePrecisionHanningNormalized") { |
| var result = [Float](repeating: 1, count: count) |
| var legacyResult = [Float](repeating: -1, count: count) |
| |
| vDSP.formWindow(usingSequence: .hanningNormalized, |
| result: &result, |
| isHalfWindow: false) |
| |
| vDSP_hann_window(&legacyResult, |
| n, |
| Int32(vDSP_HANN_NORM)) |
| |
| let returnedResult = vDSP.window(ofType: Float.self, |
| usingSequence: .hanningNormalized, |
| count: count, |
| isHalfWindow: false) |
| |
| expectTrue(result.elementsEqual(legacyResult)) |
| expectTrue(result.elementsEqual(returnedResult)) |
| } |
| |
| Accelerate_vDSPFillClearGenerateTests.test("vDSP/SinglePrecisionHanningNormalizedHalf") { |
| var result = [Float](repeating: 1, count: count) |
| var legacyResult = [Float](repeating: -1, count: count) |
| |
| vDSP.formWindow(usingSequence: .hanningNormalized, |
| result: &result, |
| isHalfWindow: true) |
| |
| vDSP_hann_window(&legacyResult, |
| n, |
| Int32(vDSP_HANN_NORM | vDSP_HALF_WINDOW)) |
| |
| let returnedResult = vDSP.window(ofType: Float.self, |
| usingSequence: .hanningNormalized, |
| count: count, |
| isHalfWindow: true) |
| |
| expectTrue(result[0 ..< count / 2].elementsEqual(legacyResult[0 ..< count / 2])) |
| expectTrue(result[0 ..< count / 2].elementsEqual(returnedResult[0 ..< count / 2])) |
| } |
| |
| Accelerate_vDSPFillClearGenerateTests.test("vDSP/SinglePrecisionHanningDenormalized") { |
| var result = [Float](repeating: 1, count: count) |
| var legacyResult = [Float](repeating: -1, count: count) |
| |
| vDSP.formWindow(usingSequence: .hanningDenormalized, |
| result: &result, |
| isHalfWindow: false) |
| |
| vDSP_hann_window(&legacyResult, |
| n, |
| Int32(vDSP_HANN_DENORM)) |
| |
| let returnedResult = vDSP.window(ofType: Float.self, |
| usingSequence: .hanningDenormalized, |
| count: count, |
| isHalfWindow: false) |
| |
| expectTrue(result.elementsEqual(legacyResult)) |
| expectTrue(result.elementsEqual(returnedResult)) |
| } |
| |
| Accelerate_vDSPFillClearGenerateTests.test("vDSP/SinglePrecisionHanningDenormalizedHalf") { |
| var result = [Float](repeating: 1, count: count) |
| var legacyResult = [Float](repeating: -1, count: count) |
| |
| vDSP.formWindow(usingSequence: .hanningDenormalized, |
| result: &result, |
| isHalfWindow: true) |
| |
| vDSP_hann_window(&legacyResult, |
| n, |
| Int32(vDSP_HANN_DENORM | vDSP_HALF_WINDOW)) |
| |
| let returnedResult = vDSP.window(ofType: Float.self, |
| usingSequence: .hanningDenormalized, |
| count: count, |
| isHalfWindow: true) |
| |
| expectTrue(result[0 ..< count / 2].elementsEqual(legacyResult[0 ..< count / 2])) |
| expectTrue(result[0 ..< count / 2].elementsEqual(returnedResult[0 ..< count / 2])) |
| } |
| |
| Accelerate_vDSPFillClearGenerateTests.test("vDSP/SinglePrecisionHamming") { |
| var result = [Float](repeating: 1, count: count) |
| var legacyResult = [Float](repeating: -1, count: count) |
| |
| vDSP.formWindow(usingSequence: .hamming, |
| result: &result, |
| isHalfWindow: false) |
| |
| vDSP_hamm_window(&legacyResult, |
| n, |
| 0) |
| |
| let returnedResult = vDSP.window(ofType: Float.self, |
| usingSequence: .hamming, |
| count: count, |
| isHalfWindow: false) |
| |
| expectTrue(result.elementsEqual(legacyResult)) |
| expectTrue(result.elementsEqual(returnedResult)) |
| } |
| |
| Accelerate_vDSPFillClearGenerateTests.test("vDSP/SinglePrecisionHammingHalf") { |
| var result = [Float](repeating: 1, count: count) |
| var legacyResult = [Float](repeating: -1, count: count) |
| |
| vDSP.formWindow(usingSequence: .hamming, |
| result: &result, |
| isHalfWindow: true) |
| |
| vDSP_hamm_window(&legacyResult, |
| n, |
| Int32(vDSP_HALF_WINDOW)) |
| |
| let returnedResult = vDSP.window(ofType: Float.self, |
| usingSequence: .hamming, |
| count: count, |
| isHalfWindow: true) |
| |
| expectTrue(result[0 ..< count / 2].elementsEqual(legacyResult[0 ..< count / 2])) |
| expectTrue(result[0 ..< count / 2].elementsEqual(returnedResult[0 ..< count / 2])) |
| } |
| |
| Accelerate_vDSPFillClearGenerateTests.test("vDSP/SinglePrecisionBlackman") { |
| var result = [Float](repeating: 1, count: count) |
| var legacyResult = [Float](repeating: -1, count: count) |
| |
| vDSP.formWindow(usingSequence: .blackman, |
| result: &result, |
| isHalfWindow: false) |
| |
| vDSP_blkman_window(&legacyResult, |
| n, |
| 0) |
| |
| let returnedResult = vDSP.window(ofType: Float.self, |
| usingSequence: .blackman, |
| count: count, |
| isHalfWindow: false) |
| |
| expectTrue(result.elementsEqual(legacyResult)) |
| expectTrue(result.elementsEqual(returnedResult)) |
| } |
| |
| Accelerate_vDSPFillClearGenerateTests.test("vDSP/SinglePrecisionBlackmanHalf") { |
| var result = [Float](repeating: 1, count: count) |
| var legacyResult = [Float](repeating: -1, count: count) |
| |
| vDSP.formWindow(usingSequence: .blackman, |
| result: &result, |
| isHalfWindow: true) |
| |
| vDSP_blkman_window(&legacyResult, |
| n, |
| Int32(vDSP_HALF_WINDOW)) |
| |
| let returnedResult = vDSP.window(ofType: Float.self, |
| usingSequence: .blackman, |
| count: count, |
| isHalfWindow: true) |
| |
| expectTrue(result[0 ..< count / 2].elementsEqual(legacyResult[0 ..< count / 2])) |
| expectTrue(result[0 ..< count / 2].elementsEqual(returnedResult[0 ..< count / 2])) |
| } |
| |
| Accelerate_vDSPFillClearGenerateTests.test("vDSP/DoublePrecisionHanningNormalized") { |
| var result = [Double](repeating: 1, count: count) |
| var legacyResult = [Double](repeating: -1, count: count) |
| |
| vDSP.formWindow(usingSequence: .hanningNormalized, |
| result: &result, |
| isHalfWindow: false) |
| |
| vDSP_hann_windowD(&legacyResult, |
| n, |
| Int32(vDSP_HANN_NORM)) |
| |
| let returnedResult = vDSP.window(ofType: Double.self, |
| usingSequence: .hanningNormalized, |
| count: count, |
| isHalfWindow: false) |
| |
| expectTrue(result.elementsEqual(legacyResult)) |
| expectTrue(result.elementsEqual(returnedResult)) |
| } |
| |
| Accelerate_vDSPFillClearGenerateTests.test("vDSP/DoublePrecisionHanningNormalizedHalf") { |
| var result = [Double](repeating: 1, count: count) |
| var legacyResult = [Double](repeating: -1, count: count) |
| |
| vDSP.formWindow(usingSequence: .hanningNormalized, |
| result: &result, |
| isHalfWindow: true) |
| |
| vDSP_hann_windowD(&legacyResult, |
| n, |
| Int32(vDSP_HANN_NORM | vDSP_HALF_WINDOW)) |
| |
| let returnedResult = vDSP.window(ofType: Double.self, |
| usingSequence: .hanningNormalized, |
| count: count, |
| isHalfWindow: true) |
| |
| expectTrue(result[0 ..< count / 2].elementsEqual(legacyResult[0 ..< count / 2])) |
| expectTrue(result[0 ..< count / 2].elementsEqual(returnedResult[0 ..< count / 2])) |
| } |
| |
| Accelerate_vDSPFillClearGenerateTests.test("vDSP/DoublePrecisionHanningDenormalized") { |
| var result = [Double](repeating: 1, count: count) |
| var legacyResult = [Double](repeating: -1, count: count) |
| |
| vDSP.formWindow(usingSequence: .hanningDenormalized, |
| result: &result, |
| isHalfWindow: false) |
| |
| vDSP_hann_windowD(&legacyResult, |
| n, |
| Int32(vDSP_HANN_DENORM)) |
| |
| let returnedResult = vDSP.window(ofType: Double.self, |
| usingSequence: .hanningDenormalized, |
| count: count, |
| isHalfWindow: false) |
| |
| expectTrue(result.elementsEqual(legacyResult)) |
| expectTrue(result.elementsEqual(returnedResult)) |
| } |
| |
| Accelerate_vDSPFillClearGenerateTests.test("vDSP/DoublePrecisionHanningDenormalizedHalf") { |
| var result = [Double](repeating: 1, count: count) |
| var legacyResult = [Double](repeating: -1, count: count) |
| |
| vDSP.formWindow(usingSequence: .hanningDenormalized, |
| result: &result, |
| isHalfWindow: true) |
| |
| vDSP_hann_windowD(&legacyResult, |
| n, |
| Int32(vDSP_HANN_DENORM | vDSP_HALF_WINDOW)) |
| |
| let returnedResult = vDSP.window(ofType: Double.self, |
| usingSequence: .hanningDenormalized, |
| count: count, |
| isHalfWindow: true) |
| |
| expectTrue(result[0 ..< count / 2].elementsEqual(legacyResult[0 ..< count / 2])) |
| expectTrue(result[0 ..< count / 2].elementsEqual(returnedResult[0 ..< count / 2])) |
| } |
| |
| Accelerate_vDSPFillClearGenerateTests.test("vDSP/DoublePrecisionHamming") { |
| var result = [Double](repeating: 1, count: count) |
| var legacyResult = [Double](repeating: -1, count: count) |
| |
| vDSP.formWindow(usingSequence: .hamming, |
| result: &result, |
| isHalfWindow: false) |
| |
| vDSP_hamm_windowD(&legacyResult, |
| n, |
| 0) |
| |
| let returnedResult = vDSP.window(ofType: Double.self, |
| usingSequence: .hamming, |
| count: count, |
| isHalfWindow: false) |
| |
| expectTrue(result.elementsEqual(legacyResult)) |
| expectTrue(result.elementsEqual(returnedResult)) |
| } |
| |
| Accelerate_vDSPFillClearGenerateTests.test("vDSP/DoublePrecisionHammingHalf") { |
| var result = [Double](repeating: 1, count: count) |
| var legacyResult = [Double](repeating: -1, count: count) |
| |
| vDSP.formWindow(usingSequence: .hamming, |
| result: &result, |
| isHalfWindow: true) |
| |
| vDSP_hamm_windowD(&legacyResult, |
| n, |
| Int32(vDSP_HALF_WINDOW)) |
| |
| let returnedResult = vDSP.window(ofType: Double.self, |
| usingSequence: .hamming, |
| count: count, |
| isHalfWindow: true) |
| |
| expectTrue(result[0 ..< count / 2].elementsEqual(legacyResult[0 ..< count / 2])) |
| expectTrue(result[0 ..< count / 2].elementsEqual(returnedResult[0 ..< count / 2])) |
| } |
| |
| Accelerate_vDSPFillClearGenerateTests.test("vDSP/DoublePrecisionBlackman") { |
| var result = [Double](repeating: 1, count: count) |
| var legacyResult = [Double](repeating: -1, count: count) |
| |
| vDSP.formWindow(usingSequence: .blackman, |
| result: &result, |
| isHalfWindow: false) |
| |
| vDSP_blkman_windowD(&legacyResult, |
| n, |
| 0) |
| |
| let returnedResult = vDSP.window(ofType: Double.self, |
| usingSequence: .blackman, |
| count: count, |
| isHalfWindow: false) |
| |
| expectTrue(result.elementsEqual(legacyResult)) |
| expectTrue(result.elementsEqual(returnedResult)) |
| } |
| |
| Accelerate_vDSPFillClearGenerateTests.test("vDSP/DoublePrecisionBlackmanHalf") { |
| var result = [Double](repeating: 1, count: count) |
| var legacyResult = [Double](repeating: -1, count: count) |
| |
| vDSP.formWindow(usingSequence: .blackman, |
| result: &result, |
| isHalfWindow: true) |
| |
| vDSP_blkman_windowD(&legacyResult, |
| n, |
| Int32(vDSP_HALF_WINDOW)) |
| |
| let returnedResult = vDSP.window(ofType: Double.self, |
| usingSequence: .blackman, |
| count: count, |
| isHalfWindow: true) |
| |
| expectTrue(result[0 ..< count / 2].elementsEqual(legacyResult[0 ..< count / 2])) |
| expectTrue(result[0 ..< count / 2].elementsEqual(returnedResult[0 ..< count / 2])) |
| } |
| |
| Accelerate_vDSPFillClearGenerateTests.test("vDSP/SinglePrecisionWithRange") { |
| var result = [Float](repeating: 1, count: count) |
| var legacyResult = [Float](repeating: -1, count: count) |
| |
| vDSP.formRamp(in: 0 ... 100, |
| result: &result) |
| |
| vDSP_vgen([0], |
| [100], |
| &legacyResult, 1, |
| n) |
| |
| let returnedResult = vDSP.ramp(in: Float(0) ... Float(100), |
| count: count) |
| |
| expectTrue(result.elementsEqual(legacyResult)) |
| expectTrue(result.elementsEqual(returnedResult)) |
| } |
| |
| Accelerate_vDSPFillClearGenerateTests.test("vDSP/SinglePrecisionRampWithIncrement") { |
| var result = [Float](repeating: 1, count: count) |
| var legacyResult = [Float](repeating: -1, count: count) |
| |
| vDSP.formRamp(withInitialValue: 0, |
| increment: 0.1, |
| result: &result) |
| |
| vDSP_vramp([0], |
| [0.1], |
| &legacyResult, 1, |
| n) |
| |
| let returnedResult = vDSP.ramp(withInitialValue: Float(0), |
| increment: Float(0.1), |
| count: count) |
| |
| expectTrue(result.elementsEqual(legacyResult)) |
| expectTrue(result.elementsEqual(returnedResult)) |
| } |
| |
| Accelerate_vDSPFillClearGenerateTests.test("vDSP/SinglePrecisionRampWithMultiplier") { |
| var result = [Float](repeating: 1, count: count) |
| var legacyResult = [Float](repeating: -1, count: count) |
| |
| let multiplier = (0 ..< n).map{ i in |
| return sin(Float(i) * 0.05) |
| } |
| |
| var start = Float(10) |
| |
| vDSP.formRamp(withInitialValue: &start, |
| multiplyingBy: multiplier, |
| increment: 1, |
| result: &result) |
| |
| var legacyStart = Float(10) |
| |
| vDSP_vrampmul(multiplier, 1, |
| &legacyStart, |
| [1], |
| &legacyResult, 1, |
| n) |
| |
| var start2 = Float(10) |
| let returnedResult = vDSP.ramp(withInitialValue: &start2, |
| multiplyingBy: multiplier, |
| increment: 1) |
| |
| expectTrue(result.elementsEqual(legacyResult)) |
| expectTrue(result.elementsEqual(returnedResult)) |
| |
| expectEqual(start, legacyStart) |
| expectEqual(start, start2) |
| } |
| |
| Accelerate_vDSPFillClearGenerateTests.test("vDSP/StereoSinglePrecisionRampWithMultiplier") { |
| var result = [Float](repeating: 1, count: count) |
| var legacyResult = [Float](repeating: -1, count: count) |
| |
| let multiplierOne = (0 ..< n).map{ i in |
| return sin(Float(i) * 0.05) |
| } |
| let multiplierTwo = (0 ..< n).map{ i in |
| return sin(Float(i) * 0.0125) |
| } |
| |
| var start = Float(10) |
| var resultTwo = [Float](repeating: 2, count: result.count) |
| |
| vDSP.formStereoRamp(withInitialValue: &start, |
| multiplyingBy: multiplierOne, multiplierTwo, |
| increment: 1, |
| results: &result, &resultTwo) |
| |
| var legacyStart = Float(10) |
| var legacyResultTwo = [Float](repeating: -2, count: legacyResult.count) |
| |
| vDSP_vrampmul2(multiplierOne, multiplierTwo, 1, |
| &legacyStart, |
| [1], |
| &legacyResult, &legacyResultTwo, 1, |
| n) |
| |
| var start2 = Float(10) |
| let returnedResult = vDSP.stereoRamp(withInitialValue: &start2, |
| multiplyingBy: multiplierOne, multiplierTwo, |
| increment: 1) |
| |
| expectTrue(result.elementsEqual(legacyResult)) |
| expectTrue(resultTwo.elementsEqual(legacyResultTwo)) |
| expectEqual(start, legacyStart) |
| |
| expectTrue(result.elementsEqual(returnedResult.firstOutput)) |
| expectTrue(resultTwo.elementsEqual(returnedResult.secondOutput)) |
| expectEqual(start, start2) |
| } |
| |
| Accelerate_vDSPFillClearGenerateTests.test("vDSP/DoublePrecisionRampWithRange") { |
| var result = [Double](repeating: 1, count: count) |
| var legacyResult = [Double](repeating: -1, count: count) |
| |
| vDSP.formRamp(in: 0 ... 100, |
| result: &result) |
| |
| vDSP_vgenD([0], |
| [100], |
| &legacyResult, 1, |
| n) |
| |
| let returnedResult = vDSP.ramp(in: Double(0) ... Double(100), |
| count: count) |
| |
| expectTrue(result.elementsEqual(legacyResult)) |
| expectTrue(result.elementsEqual(returnedResult)) |
| } |
| |
| Accelerate_vDSPFillClearGenerateTests.test("vDSP/DoublePrecisionRampWithRange") { |
| var result = [Double](repeating: 1, count: count) |
| var legacyResult = [Double](repeating: -1, count: count) |
| |
| vDSP.formRamp(withInitialValue: 0, |
| increment: 0.1, |
| result: &result) |
| |
| vDSP_vrampD([0], |
| [0.1], |
| &legacyResult, 1, |
| n) |
| |
| let returnedResult = vDSP.ramp(withInitialValue: 0, |
| increment: 0.1, |
| count: count) |
| |
| expectTrue(result.elementsEqual(legacyResult)) |
| expectTrue(result.elementsEqual(returnedResult)) |
| } |
| |
| Accelerate_vDSPFillClearGenerateTests.test("vDSP/DoublePrecisionRampWithMultiplier") { |
| var result = [Double](repeating: 1, count: count) |
| var legacyResult = [Double](repeating: -1, count: count) |
| |
| let multiplier = (0 ..< n).map{ i in |
| return sin(Double(i) * 0.05) |
| } |
| |
| var start = Double(10) |
| |
| vDSP.formRamp(withInitialValue: &start, |
| multiplyingBy: multiplier, |
| increment: 1, |
| result: &result) |
| |
| var legacyStart = Double(10) |
| |
| vDSP_vrampmulD(multiplier, 1, |
| &legacyStart, |
| [1], |
| &legacyResult, 1, |
| n) |
| |
| var start2 = Double(10) |
| let returnedResult = vDSP.ramp(withInitialValue: &start2, |
| multiplyingBy: multiplier, |
| increment: 1) |
| |
| expectTrue(result.elementsEqual(legacyResult)) |
| expectTrue(result.elementsEqual(returnedResult)) |
| |
| expectEqual(start, legacyStart) |
| expectEqual(start, start2) |
| } |
| |
| Accelerate_vDSPFillClearGenerateTests.test("vDSP/StereoDoublePrecisionRampWithMultiplier") { |
| var result = [Double](repeating: 1, count: count) |
| var legacyResult = [Double](repeating: -1, count: count) |
| |
| let multiplierOne = (0 ..< n).map{ i in |
| return sin(Double(i) * 0.05) |
| } |
| let multiplierTwo = (0 ..< n).map{ i in |
| return sin(Double(i) * 0.0125) |
| } |
| |
| var start = Double(10) |
| var resultTwo = [Double](repeating: 2, count: result.count) |
| |
| vDSP.formStereoRamp(withInitialValue: &start, |
| multiplyingBy: multiplierOne, multiplierTwo, |
| increment: 1, |
| results: &result, &resultTwo) |
| |
| var legacyStart = Double(10) |
| var legacyResultTwo = [Double](repeating: -2, count: legacyResult.count) |
| |
| vDSP_vrampmul2D(multiplierOne, multiplierTwo, 1, |
| &legacyStart, |
| [1], |
| &legacyResult, &legacyResultTwo, 1, |
| n) |
| |
| var start2 = Double(10) |
| let returnedResult = vDSP.stereoRamp(withInitialValue: &start2, |
| multiplyingBy: multiplierOne, multiplierTwo, |
| increment: 1) |
| |
| expectTrue(result.elementsEqual(legacyResult)) |
| expectTrue(resultTwo.elementsEqual(legacyResultTwo)) |
| expectEqual(start, legacyStart) |
| |
| expectTrue(result.elementsEqual(returnedResult.firstOutput)) |
| expectTrue(resultTwo.elementsEqual(returnedResult.secondOutput)) |
| expectEqual(start, start2) |
| } |
| } |
| |
| runAllTests() |