// // main.swift // WaterfallFile // // Created by Jacky Jack on 23/12/2024. // import Foundation import Accelerate import ArgumentParser //set the command line arguments struct CommandLineArgs: ParsableCommand { //input file format detected from file extension @Argument var inputFile:String = "" //output file format detected from file extension @Argument var outputFile:String = "" } let args = CommandLineArgs.parseOrExit() print("Read binary file") let input_filename=args.inputFile //get data from u8 file let fileReader = FileReader() do { try fileReader.open(filename: input_filename) } catch { print("Cant open file \(input_filename)") exit(0) } var i8_arr:[Int8]? = nil do { try i8_arr = fileReader.readAllInt8() } catch { print("Got error \(error)") } fileReader.close() //all data in buffer lets process data //convert all u8 data to float's //is there other ways to do that? //will generate 512x512 image let sampleCount = 512 let img = SimpleImage(width: sampleCount, height: sampleCount) let number_of_lines = (i8_arr!.count/sampleCount) var frequencyDomain:[Float] = [] var transform_result:[Float] = .init(repeating: 0.0, count: sampleCount) let fft512 = NaiveFFT512() for i in 0..<sampleCount { let sample_idx = i*sampleCount if i < number_of_lines { let processingSlice = i8_arr![sample_idx...sample_idx+512-1] let processingArray = Array(processingSlice) transform_result = fft512.computeLine(processingArray) //let max = vDSP.maximum(transform_result) //print("max=\(max)") //frequencyDomain.append(contentsOf: transform_result) img.drawPalletLine(line: i, pixelLine: transform_result) //print(transform_result) } else { img.drawPalletLine(line: i, pixelLine: transform_result) } } img.drawPixel(0, 0, PixelData(a: 255, r: 255, g: 0, b: 0)) img.drawPixel(sampleCount-1, 0, PixelData(a: 255, r: 0, g: 255, b: 0)) img.drawPixel(0, sampleCount-1, PixelData(a: 255, r: 0, g: 255, b: 0)) img.drawPixel(sampleCount-1, sampleCount-1, PixelData(a: 255, r: 0, g: 0, b: 255)) //print(dataFloat) //output data to image file img.saveAsJPEG(args.outputFile) print("All computations are done")