QVector 总是推回 0?

Posted

技术标签:

【中文标题】QVector 总是推回 0?【英文标题】:QVector always push back 0? 【发布时间】:2018-12-18 12:58:43 【问题描述】:

我正在使用 FFTW 构建音乐可视化工具。在我的头文件中,我构造了一个结构:

struct SpectrumStruct
    qreal frequency;
    qreal amplitude;
; 

QVector<SpectrumStruct> m_spectrum;

在我的 .cpp 文件中,

void Widget::debug(QAudioBuffer buf)

    QAudioBuffer :: S16S * data = buf.data<QAudioBuffer :: S16S>();
    int sampleRate = buf.format().sampleRate();
//    int N = buf.frameCount();
    int N = 1024;
    fftw_complex *in, *out;
    in = (fftw_complex *)fftw_malloc(sizeof(fftw_complex) * N);
    out = (fftw_complex *)fftw_malloc(sizeof(fftw_complex) * N);
    for (int i = 0; i < N; ++i) 
        qreal hannwindow = 0.5 * (1 - qCos((2 * M_PI * i) / (N - 1)));
        in[i][0] = data[i].left * hannwindow;
        in[i][1] = 0;
    
    fftw_plan myPlan = fftw_plan_dft_1d(N, in, out, FFTW_FORWARD, FFTW_ESTIMATE);
    fftw_execute(myPlan);
    for(int i = 0; i < N / 2; ++i) 
        struct SpectrumStruct thisSP;
        thisSP.frequency = double(i * sampleRate / N);
        qreal thisAmpt = qSqrt(out[i][0] * out[i][0] + out[i][1] * out[i][1]);
//        thisAmpt = 2.0 * thisAmpt / N;
        thisAmpt = 0.15 * log10(thisAmpt);
        thisAmpt = qMax(qreal(0.0), thisAmpt);
        thisAmpt = qMin(qreal(1.0), thisAmpt);
        thisSP.amplitude = thisAmpt;
        m_spectrum.push_back(thisSP);
        qDebug() << m_spectrum[i].frequency << "\t" << m_spectrum[i].amplitude << "\t" << thisAmpt;
    

    fftw_destroy_plan(myPlan);
    fftw_free(in);
    fftw_free(out);


我尝试打印每个采样点的频率和幅度。 thisAmpt 应该与m_spectrum[i].amplitude 相同。 但最后在控制台中thisAmpt 是正确的但m_spectrum[i].amplitude 始终为0。 怎么可能?

部分控制台结果:

20887    0   0.0475125
20930    0   0.0734866
20973    0   0.0784833
21016    0   0.156529
21059    0   0.19284
21102    0   0.168585
21145    0   0.134795
21188    0   0.119863
21231    0   0.122281
21274    0   0.138717
21317    0   0.15457
21360    0   0.139525
21404    0   0.0697819
21447    0   0.0985039
21490    0   0.153734
21533    0   0.147471
21576    0   0.0658756
21619    0   0.13765
21662    0   0.151573
21705    0   0.179327
21748    0   0.184664
21791    0   0.162867
21834    0   0.166042
21877    0   0.128155
21920    0   0.0839292
21963    0   0.0618584
22006    0   0.146992

【问题讨论】:

你确定 m_spectrum 在调用 debug 之前是空的吗?如果不是 m_spectrum[i] 则无法访问通过 push_back 添加的值,而是访问频率不为空但幅度为的旧值。 确保 qDebug 附加值使用m_spectrum.back() 而不是m_spectrum[i] 如果 buf.frameCount() = 1024 吗? 我只是发现我的代码有什么问题。我忘了在添加价值之前清除矢量。谢谢大家:) 【参考方案1】:
thisSP.frequency = double(i * sampleRate / N);

括号中的表达式具有整数类型,然后转换为双精度。因此,如果你在 [0;1) 范围内得到结果,你会得到零,然后将其转换为 double。

也许,你想要这样的想法:

thisSP.frequency = double(i) * sampleRate / N;

【讨论】:

【参考方案2】:

就像 @bruno 的 cmets 一样,我忘记清除向量:m_spectrum 在向其添加值之前。谢谢大家解决我的问题:)

【讨论】:

以上是关于QVector 总是推回 0?的主要内容,如果未能解决你的问题,请参考以下文章

从 QVector 中删除所有小于 0 的元素

指向 QVector 的指针

“QVector<QVector<QVector<T>>> 向量”是啥意思?

如何从 QVector<QVector<T>> 获取 QVector<T>?

qvector倒序插入

修改作为指针传递的 QVector 的 QVector