Отображение спектрограммы с помощью Swift 3 - PullRequest
0 голосов
/ 11 октября 2018

Я хотел бы отобразить спектрограмму в Swift для macOS.При отображении волнового файла или спектра я использую NSBezierPath.Линии не меняют цвет.

В этом случае каждое БПФ будет представлено вертикальной линией, точки которой представляют величину этого БПФ.Я хотел бы дать цвет для каждой точки в зависимости от значения величины, и кажется, что это трудно сделать оптимизированным способом с NSBezierPath.Кто-нибудь может предложить подход для этого?

ОБНОВЛЕНИЕ: вот что я пытаюсь сделать:

func drawChunkFFT(rect: CGRect, spectrum: Array<Float>) {
    self.convertToPoints(spectrum: spectrum, samplesPerPixel: 2)
    var f = 0
    var x = 10
    let ctx = NSGraphicsContext.current?.cgContext
    ctx!.beginPath();
    ctx!.move(to: CGPoint(x:x,y:0))
    for _ in readFile.points{
        ctx!.move(to: CGPoint(x:ctx!.currentPointOfPath.x,y:ctx!.currentPointOfPath.y))
        ctx!.addLine(to: CGPoint(x:x, y:f))
        ctx!.setStrokeColor(red: readFile.points[f]/255, green: readFile.points[f]/255, blue: readFile.points[f]/255, alpha: 1.0)
        f += 1
    }
    ctx!.strokePath()
}

Значения:

55.76425552368164 for f 0
54.63053512573242 for f 1
216.34625244140625 for f 2
299.5468444824219 for f 3
71.74128723144531 for f 4
51.18459701538086 for f 5
17.891700744628906 for f 6
15.77481460571289 for f 7
18.720001220703125 for f 8

до f= 255, с уменьшающимися значениями

Я вижу вертикальную линию при x = 10, но все точки имеют одинаковый цвет, в то время как я ожидал уровня серого

Что я делаю не так?

1 Ответ

0 голосов
/ 12 октября 2018

Вот ответ на вопрос:

func drawChunkFFT(rect: CGRect, spectrum: Array<Float>) {
    self.convertToPoints(spectrum: spectrum, samplesPerPixel: 1)
    var f = 0
    var x = 10
    let ctx = NSGraphicsContext.current?.cgContext
    var value = 0
    ctx!.beginPath();
    ctx!.move(to: CGPoint(x:x,y:0))
    for _ in readFile.points{
        ctx!.move(to: CGPoint(x:x,y:f))
        ctx!.addLine(to: CGPoint(x:x, y:f+1))
        if(readFile.points[f] > 255) { value = 0} else { value = Int(255 - readFile.points[f])}
        ctx!.setStrokeColor(red: CGFloat(value)/255, green: CGFloat(value)/255, blue: CGFloat(value)/255, alpha: 1.0)
        f += 1
        ctx!.strokePath()
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...