هو يستطيع كنت على نحو سلس مستوى الصوت القياس أكثر واقعية التناظرية VU متر ؟

StackOverflow https://stackoverflow.com/questions/4252695

سؤال

لقد بنيت يحتذى التناظرية متر VU لتسجيل التطبيق ويكون كل شيء التوصيل بشكل صحيح والعمل الطريقة أتوقع ما عدا جانب واحد.إذا كنت مشاهدة هذا 13-الفيديو الثاني من فو متر في العمل ، وسوف نرى أن الإبرة مستبعد في كل مكان وليس حقا ما سيحدث في فو متر.للحصول على مثال ما أبحث عنه ، جرب أبل "المذكرات الصوتية" التطبيق ومعرفة.

المنطق بلدي حتى الآن هو سهل:

#define VU_METER_FREQUENCY                                      1.0/5.0

- (void)someMethod {
    _updateTimer = [NSTimer 
                    scheduledTimerWithTimeInterval:VU_METER_FREQUENCY
                    target:self 
                    selector:@selector(_refresh) 
                    userInfo:nil 
                    repeats:YES];
}

- (void)_refresh {  
    // if we have no queue, but still have levels, gradually bring them down
    if (_delegate == nil) {
        CFAbsoluteTime thisFire = CFAbsoluteTimeGetCurrent();
        // calculate how much time passed since the last draw
        CFAbsoluteTime timePassed = thisFire - _peakFalloffLastFire;
        needleValue = needleValue - timePassed * VU_METER_LEVEL_FALL_OFF_PER_SECOND;
        if (needleValue < VU_METER_MIN_DB) {
            needleValue = VU_METER_MIN_DB;
            TT_INVALIDATE_TIMER(_updateTimer);
        }
        _peakFalloffLastFire = thisFire;
    } else {
        prevNeedleValue = needleValue;
        needleValue = [_delegate currentDB];
    }
    [self updateNeedle];
}

- (void)updateNeedle {
    [UIView beginAnimations:nil context:NULL]; // arguments are optional
    [UIView setAnimationDuration:VU_METER_FREQUENCY];
    [UIView setAnimationCurve:(needleValue > prevNeedleValue ? UIViewAnimationCurveEaseOut : UIViewAnimationCurveEaseIn)];
    CGFloat radAngle = [self radianAngleForValue:needleValue];
    self.needle.transform = CGAffineTransformMakeRotation(radAngle);
    [UIView commitAnimations];
}

أساسا أنا الإعداد الموقت لتشغيل في VU_METER_FREQUENCY وتحديث إبرة دوران باستخدام UIView الرسوم المتحركة مع التيسير تفضيلية للحفاظ على الإبرة أعلى.أنا أبحث عن وسيلة لضبط هذا بطريقة أو بأخرى لتوفير سلاسة إبرة مع المعيار يجري في أقرب وقت ممكن إلى أبل التناظرية فو متر.للحصول على needleValue, أنا باستخدام AudioQueue's mAveragePower والاستعلام عن ذلك في كل مرة currentDB ويسمى.كيف يمكنني السلس هذا ؟

هل كانت مفيدة؟

المحلول

شيء واحد أود أن أقترح تغيير هذا.

#define VU_METER_FREQUENCY    1.0/5.0

يقول تحديث 5x الثانية ، المشكلة هي أنني أعتقد أن أبل سوف يعقد 0.2 s من العينات ، لذلك كنت حقا الحصول على متوسط أصوات ، وبالتالي متر لا حقا بعد الارتفاعات والانخفاضات من الأصوات ولكن أكثر من أقل من المتوسط.

أعتقد أن هذا الإعداد يمكن أن يصل إلى 1.0/60 (60 هرتز).

كما جعل متر على نحو سلس ، وهذا هو قليلا tricker.

هل يمكن أن تفعل شيئا مثل هذا.

  1. إنشاء صفيف الذي يحمل 7-8 القيم.
  2. في كل مرة تحصل على القراءة ، إضافة إلى مجموعة pop 7 القيمة (على سبيل المثال تعقد فقط في آخر سبع القيم.
  3. العثور على متوسط من مجموعة (مبلغ مجموعة / القسمة على عدد العناصر في الصفيف.
  4. عرض هذا المتوسط.

لذلك قليلا مثل ملء الأنابيب ، و بمجرد التوقف عن ملء سوف يستغرق بعض الوقت من أجل أن الفارغة و إبرة سوف تسقط ببطء.

أو هل يمكن أن تسمح فقط الإبرة تسقط الكثير من كل دورة.

يتيح القول الإبرة وتقلب تكون 0 (أدنى قيمة) و 1 (أعلى قيمة بكثير من الجانب الأيمن).يتيح أيضا أقول لك عينة في 20hz (20x مرة في الثانية).

في كل مرة تقوم بتحديث موقف تسمح فقط الإبرة إلى ارتفاع أقول 0.1 من قيمة الحد الأقصى وسقوط فقط 0.05 من قيمة.

هل يمكن أن تفعل شيئا من هذا القبيل و اللعب مع القيم للحصول على انها لطيفة وناعمة.

if newValue>currentMeterValue
   currentMeterValue = Min(currentMeterValue + 0.1, newValue);
else
   currentMeterValue = Max(currentMeterValue - 0.05, newValue);

أو

يمكنك ببساطة تحريك متر بمعدل يتناسب مع المسافة بين كل قيمة (هذا ينبغي على نحو سلس جيد) و في الواقع تكون قريبة من الحقيقية متر مع الربيع دفع ضد الإبرة الذي هو مدعوم من قبل الكهربائي.

   currentMeterValue += (newValue - currentMeterValue)/4.0;

نصائح أخرى

وفقا لويكيبيديا ، سلوك VUMeter هو محدد في مواصفات ANSI C16.5-1942.الإبرة كاملة صعود وهبوط الوقت هو من المفترض أن يكون 300 ميللي ثانية ، حيث بلغ متوسطها بريق خلال تلك المدة.

سوف أحاول 1-القطب مرشح تمرير منخفض على الإبرة زاوية لتقريب أن معدل الزاوي ، وتحريك متر يدويا على الإطار حسب الإطار الأساس باستخدام CADisplayLink على أساس drawRect الرسوم المتحركة.عرض الرسوم المتحركة قد لا تعطي نفس الاستجابة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top