【问题标题】:Matlab get amount of clippingMatlab获取剪裁量
【发布时间】:2015-10-25 06:45:56
【问题描述】:

您好,我正在尝试使用 matlab 测量音频文件中剪辑样本的数量。这意味着我想获得处于满量程值(最小值和最大值)的所有样本的数量。但是当这个值至少有两个以下样本时,它应该只计算它们。

到目前为止我的代码:

for i = 1 :20 
    fileName = ['Elektro',num2str(i) '.wav'];
    unclipped = audioread(fileName);
    summeMax = sum(1 ==unclipped); 
    summeMin = sum(-1==unclipped);  
    summe = summeMin +summeMax;
    str=sprintf('%d ',summe);
    disp(str);
end

正如您所见,它对每个样本进行计数,我需要一个循环和 if 语句来检测在满量程值处是否有多个样本。

我用来自j = 1 : length(unclipped) 的循环尝试了这个,但是这个方法需要很长时间。

任何人有建议我怎么能做到这一点?

【问题讨论】:

    标签: matlab clipping


    【解决方案1】:

    正如@Daniel 在his answer 中对您的上一个问题指出的那样,您可以找到达到最大值的所有样本

    maxReached = max(unclipped(:))==unclipped;
    

    要删除仅对一个样本达到最大值的所有位置,您可以使用带有结构元素[1,1] 的形态开口:

    clippedSamples = imopen(maxReached, [1 1]);
    

    现在截取的样本数为

    sum(clippedSamples);
    

    当然,您必须对达到最小值的那些样本执行相同操作。

    【讨论】:

    • 好的,谢谢,我试过了,但是在没有 imopen 的情况下,我在任何地方都能得到相同的输出。并且有很多输出为 1 结果应该是不可能的
    • 我无法重现。例如。 imopen([0 1 1 0 0 1 0],[1 1]) 确实有效并删除了单个 1。你能否展示一个数据的小例子,它在哪里不起作用?
    • 我真的不知道你想看什么?但问题是我尝试了 imopen 的工作原理,但即使使用 [1 1 1] 我得到相同的结果,可能是 imopen 之前的值以另一种格式保存吗?
    • 也许我误解了你的问题。以[ 1 1 1 ] 作为输入,结果应该是3,还是不是? imopen 不会更改 [1 1 1],因为它有多个 1。你可以例如添加一个可能包含 10 个向量条目的简单示例,并告诉我们预期的结果应该是什么。
    • 不抱歉,我的意思是我使用了 imopen(达到最大值,[1 1 1]),没有任何改变
    猜你喜欢
    • 2014-07-30
    • 2013-04-20
    • 2012-11-08
    • 2016-12-05
    • 2012-02-12
    • 1970-01-01
    • 2013-05-10
    • 2012-01-15
    相关资源
    最近更新 更多