1 /***************************************************************************
2 * Copyright (C) 2010 by Simon Andreas Eugster (simon.eu@gmail.com) *
3 * This file is part of kdenlive. See www.kdenlive.org. *
5 * This program is free software; you can redistribute it and/or modify *
6 * it under the terms of the GNU General Public License as published by *
7 * the Free Software Foundation; either version 2 of the License, or *
8 * (at your option) any later version. *
9 ***************************************************************************/
12 Displays a spectral power distribution of audio samples.
13 The frequency distribution is calculated by means of a Fast Fourier Transformation.
14 For more information see Wikipedia:FFT and the code comments.
17 #ifndef AUDIOSPECTRUM_H
18 #define AUDIOSPECTRUM_H
21 //#define DEBUG_AUDIOSPEC
27 #include "abstractaudioscopewidget.h"
28 #include "ui_audiospectrum_ui.h"
29 #include "tools/kiss_fftr.h"
32 class AudioSpectrum_UI;
33 class AudioSpectrum : public AbstractAudioScopeWidget {
37 AudioSpectrum(QWidget *parent = 0);
40 // Implemented virtual methods
41 QString widgetName() const;
45 ///// Implemented methods /////
47 QImage renderHUD(uint accelerationFactor);
48 QImage renderAudioScope(uint accelerationFactor, const QVector<int16_t> audioFrame, const int freq, const int num_channels, const int num_samples, const int newData);
49 QImage renderBackground(uint accelerationFactor);
50 bool isHUDDependingOnInput() const;
51 bool isScopeDependingOnInput() const;
52 bool isBackgroundDependingOnInput() const;
53 virtual void readConfig();
56 virtual void handleMouseDrag(const QPoint movement, const RescaleDirection rescaleDirection, const Qt::KeyboardModifiers rescaleModifiers);
59 Ui::AudioSpectrum_UI *ui;
62 QAction *m_aTrackMouse;
65 QVector<float> m_lastFFT;
66 QSemaphore m_lastFFTLock;
68 /** Contains the plot only; m_scopeRect contains text and widgets as well */
69 QRect m_innerScopeRect;
71 /** Lower bound for the dB value to display */
73 /** Upper bound (max: 0) */
76 /** Maximum frequency (limited by the sampling rate if determined automatically).
77 Stored for the painters. */
79 /** The user has chosen a custom frequency. */
82 /** This is linear interpolation with the special property that it preserves peaks, which is required
83 for e.g. showing correct Decibel values (where the peak values are of interest).
84 Consider f = {0, 100, 0}
85 x = {0.5, 1.5}: With default linear interpolation x0 and x1 would both be mapped to 50.
86 This function maps x1 (the first position after the peak) to 100.
88 @param in The source vector containing the data
89 @param targetSize Number of interpolation nodes between ...
90 @param left the left array index in the in-vector and ...
91 @param right the right array index (both inclusive).
92 @param fill If right lies outside of the array bounds (which is perfectly fine here) then this value
93 will be used for filling the missing information.
95 static const QVector<float> interpolatePeakPreserving(const QVector<float> in, const uint targetSize, uint left = 0, uint right = 0, float fill = 0.0);
97 #ifdef DEBUG_AUDIOSPEC
104 void slotResetMaxFreq();
108 #endif // AUDIOSPECTRUM_H