Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Rozpoznawanie wysokości dźwięku

04 Wrz 2009 18:14 5496 25
  • Poziom 11  
    Witam, chcę stworzyć precyzyjny tuner (o dokładności lepszej do 1 centa a najlepiej lepszej). Czas zbierania próbek ma być nie większy niż 3 sekundy (dla fs=44100). Jak na razie posłużyłem się FFT, ale musiałbym użyć astronomicznych wartości, żeby uzyskać żądaną dokładność. Ale jest coś takiego jak interpolacja, jeszcze nie sprawdzałem czy daje wymierne rezultaty. Może to jest najwłaściwsze rozwiązanie? Jeśli interpolacja to też pozostaje pytanie jaka.
    A jeśli nie fft+interpolacja to co? Zastosowaniem tego tunera ma być głównie strojenie organów piszczałkowych, amplituda dźwięku nie spada w czasie więc jest to pewne udogodnienie.
    Ilość obliczeń może być spora (oczywiście bez przesady), grunt, żeby było precyzyjnie.

    Intryguje mnie rozpoznawanie wys. w Adobe Audition. Działa to bardzo szybko i już na FFT 16384 osiąga bardzo dużą dokładność.

    Będę wdzięczny za wszelkie wskazówki.
  • Poziom 26  
    A może uda się zrobić to wykorzystując gęstość przejść przez zero. Przy organach amplituda jest dość duża, powinno się udać.
  • Poziom 11  
    Na głosach fletowych fala jest nieskomplikowana, ale języczkowych o takim chropowatym brzmieniu jest wiele przejść przez zero przy jednym okresie, więc odpada.
  • Poziom 27  
    Jeżeli uprzesz się na FFT, to sięgnij po fftw, a jeżeli chcesz poprawić wyniki z pomiarem przejść przez zero, to zastosuj programowy przerzutnik shmitta - jeżeli próbka przekroczy dodatni próg, to stan=1; jeżeli próbka przekroczy ujemny próg, to stan=0. Próg możesz ustalić przyjmując jakąś stałą wartość, na przykład maksimum bezwzględnej wartości próbki podzielone przez typowe 10.

    Biblioteka FFTW ma tę zaletę, że korzysta z dostępnych technologii procesora na którym jest uruchomiona - przykładowo SSE1 (dokładność floata) daje ogromne przyspieszenie w porównaniu ze zwykłym koprocesorem (FPU), a na dodatek wykonuje cztery obliczenia jednocześnie (dwa w SSE2 - double prec.), co daje dodatkowy wzrost wydajności. Z procesorem mobilnym Pentium M 1.86GHz (jeden rdzeń), FFT z 32768 próbkami na wejściu działa w czasie rzeczywistym bez żadnego problemu i to 20 razy na sekundę. Pomijam fakt że wynik z każdej kolejnej transformaty jest wyświetlany w oknie w postaci spektrum za pomocą zwyczajnych funkcji GDI...
  • Poziom 11  
    ale jeśli fft (a to wolę) to wciąż pozostaje problem dokładnego wyznaczenia tej częstotliwości. więc interpolacja?jak tak, to jaka? i czy ma ktoś może jakiś kod w C, którego byłbym w stanie użyć.
    z tym przerzutnikiem Schmitta wolę nie, to rozwiązania zakładające pewną specyfikę sygnału, a z pewnością znajdzie się trochę przypadków, które nie spełnią przyjętych założeń. fft jest pewniejsze.
  • Poziom 15  
    Myślę, że dobrym rozwiązaniem będzie zastosowanie transformacji świergotowej (wyznaczenie prążków w określonym przedziale f). Dla zautomatyzowania całości wyznaczasz najpierw transformatę FFT np. 256 prążków, w ten sposób uzyskujesz zgrubną informację o wysokości tonu i na jej podstawie obliczasz transformatę świergotową w wąskim paśmie, które cię interesuje.
  • Poziom 26  
    Pokombinuj też z rodzajem okien, AIPSę miałem już dość dawno, ale z tego co pamiętam, wybór okna ma wpływ na ilość prążków bocznych, a te w twoim przypadku będą zakłócać twój pomiar. Dobrze też podpowiada kolega Aro_, żeby zrobić dwie transformaty.
    Jesteś pewien, że piszczałki języczkowe mają większą ilość przejść przez zero w okresie? To by oznaczało silnie dominujące wyższe harmoniczne. Jak masz taką możliwość wrzuć parę screenów z przebiegami 2-3 okresów jednych i drugich piszczałek. Może coś wymyślimy na tzw. oko. Niektóre przebiegi są charakterystyczne na tyle, że można dla nich wybrać jakąś nieraz zupełnie nietypową metodę. Pogrzebie w starych papierach, może znajdę implementację znajdowania tonu krtaniowego i formantów, to coś bym ci coś może podpowiedział, ale za wiele nie oczekuj, bo robię remont i mam straszny burdel.
  • Poziom 11  
    Tu kilka przykładów, z pewnością znajdą się jeszcze inne. Małym plusem jest, że mam zamiaru stroić to podpinając Line6 Toneport, gdzie mam equalizer, kompresor i inne bajery, które mogą pomóc stroikowi, jeśli sygnał będzie sprawiać problemy.

    Szczerze mówiąc nie liczę na fikuśny, szybki algorytm. Zależy mi trochę na czasie i program mógłby działać bardziej ociężale (wykonywać więcej obliczeń), byleby precyzyjnie i nie zbierał próbek przez więcej niż kilka sekund.

    W DSP jestem dość kiepski i szczerze mówiąc nie bardzo mam pojęcie co miały by dać inne rodzaje okien.

    proszę umieścić obrazek na serwerze
    obrazki.elektroda.pl
    And!
  • Poziom 10  
    Wszystko zależy, czy chcesz mierzyć sygnał z dominującą jedną częstotliwością, czy wiele harmonicznych. W pierwszym przypadku jest nieco prościej - wystarczy filtr pasmowy, jednak w bardzo zawężonym oknie pomiaru dokładność będzie funkcją hiperboliczną zależną od częstotliwości mierzonej i częstotliwości próbkowania. Częstotliwość wielu harmonicznych można zmierzyć przy pomocy transformaty Fouriera, jednaj dokładność pomiaru będzie zależna od ilości próbek b=1/2f.

    Pozdrawiam
    S.Tomczyk
    http://www.stelektronik.pl/
  • Poziom 11  
    sebektomczyk napisał:
    jednak w bardzo zawężonym oknie pomiaru


    Pytanie klucz :) jak to osiągnąć?
  • Poziom 26  
    Siedziałem trochę nad tymi próbkami w AdobeAudition i na ProToolsie, ale szczerze mówiąc nie wiele więcej wymyśliłem niż dotychczas tu było powiedziane. Najgorsze są niskie tony z dużą ilością harmonicznych. Tam ekstrakcja tonu podstawowego jest w zasadzie niemożliwa z zadowalającą precyzją. Pytanie do ciebie - czy może dałoby się wtedy oprzeć na badaniu położenia np 3ciej lub 5tej harmonicznej.
  • Poziom 11  
    no czemu nie, tylko wciąż nie wiem jak w praktyce osiągnąć większą dokładność, tzn ograniczyć zakres badanych częstotliwości np. do 250-255Hz i mieć pomiędzy tymi krańcami N (rozdzielczość FFT) prążków. wiem, że to możliwe, ale no niestety jestem kiepski w te klocki i albo mi to ktoś pokaże i powie o co w tym chodzi, albo do tego nie dojdę :) choć pewnie i tak niespecjalnie zrozumiem uzasadnienie. no niestety przydałaby się gruntowna wiedza z tego zakresu. nie mam zamiaru drążyć DSP, tylko ten jeden mały projekcik chciałbym zrealizować :)
  • Poziom 28  
    Chyba się powtarzam...
    Z dużym kosztem: FFT z zero-paddingiem (jeśli w ogóle dane z 3 sek. wystarczą do 1 centa; teraz nie mam czasu na rachunki-sorry)
    Z mniejszym:
    FFT oryginalnego rekordu - pierwsze przybliżenie f
    potem np. 10 * algorytm Goertzla (na wyznaczenie 1 kanału FFT) dla częstotliwości f+/-1,2,3,4,5 centów.
    Ze względu na charakter obliczeń w zero-paddingu obliczenia tylko dla właściwego rekordu bo dalej już same zera.
  • Poziom 10  
    Problem jest do rozwiązania w prosty sposób (o ile jeszcze tego nie zrobiłeś). Tylko brakuje mi kilku istotnych informacji. Czy sygnał jest czysty czy zaszumiony. Pomiar przez 3 sekundy - a co ze stabilnością badanej częstotliwości? Jaka jest charakterystyka sygnału, to znaczy czy to jest prawie czysty sinus czy jakiś przebieg harmoniczny, co z harmonicznymi, duże, małe, w porównaniu do składowej głównej? Jakie są wartości szukanej częstotliwości? Kilka Hz, kilka tysięcy? Czy częstotliwość której szukasz jest choć mniej więcej znana? Jeśli tak to z jaką dokładnością? Czy masz możliwość obiektywnej oceny swojego algorytmu? Jakiś miernik wzorcowy, cokolwiek? Swego czasu obmyśliłem prosty algorytm wyznaczania częstotliwości z widma dla zakresu f od 100 do 400 Hz, przy rozdzielczości widma około 15Hz (fft512) da się uzyskać dokładność nawet dziesiątych części Hz
  • Poziom 11  
    Zarobiony ostatnio jestem i w ogóle już o tym zapomniałem, ale chętnie bym jeszcze do tego wrócił.

    Odnośnie algorytmu Goertzla, dobrze wiedzeć, że coś takiego istnieje :) Postaram się w to wgłębić, poszukać jakiś gotowych kodów do obliczania tego.

    Odpowiadając na pytania pz78. Sygnał ma w sobie trochę szumu, ale raczej dominuje sygnał właściwy, częstotliwość jest raczej stabilna, są raczej niezauważalne dla ucha wahania, niektóre dźwięki mają sporo harmonicznych, ale generalnie skupiłbym się na strojeniu do tej częstotliwości jaka na widmie jest najmocniejsza. jak to będzie pierwsza (oktawę wyżej) no to niech do niej stroi, nie widzę tu problemu. szukana częstotliwość to generalnie całe słyszalne pasmo. szukana częstotliwość zwykle jest znana (i stąd były moje pomysły na udawanie tunera stroboskopowego). testem algorytmu będzie czy stroi w oktawach i czy interwały dobrze brzmią :) czy to subiektywne czy obiektywne, nie wiem.
  • Poziom 27  
    Sporo kolegów "rzuciło się" w objęcia FFT, a tym czasem istnieje prostszy "analogowy" pomysł.
    Znany od zawsze w radiotechnice:
    Najzwyklejsze w świecie zdudnienie sygnału mierzonego z wzorcowym.

    Mikrofon w łapę, pod piszczałkę, do komputera, który to zsampluje i wymnoży przez wzorcowy przebieg sinusoidalny o stałej amplitudzie i regulowanej z DOWOLNĄ precyzją częstotliwości. Efekt działania odsłuchujemy na słuchawkach.

    Jaki będzie wynik takiej operacji?

    Matematyka powiada (sin(a)sin(b) = ..... - znajdźcie sobie w tablicach trygonometrycznych z gimnazjum), że jak się wymnoży dwie funkcje okresowe przez siebie (zakładamy w tej chwili, że obie są sinusami), to w wyniku otrzymamy przebieg zmodulowany o częstotliwości będącej sumą częstotliwości wymnażanych funkcji. To akurat nie jest ważne tutaj.

    Ważniejsze jest, że obwiednia tego sygnału będzie zmieniać się z szybkością proporcjonalną do różnicy częstotliwości obu sygnałów.
    Zatem podczas strojenia przez zdudnianie, sygnał po wymnożeniu będzie robił się raz głośniejszy a raz cichszy - wahania głośności będą tym wolniejsze im częstotliwości bardziej do siebie zbliżone.

    Podczas strojenia trzeba będzie dążyć to tego aby głośność tego sygnału nie zmieniałą się w czasie. I tylko tyle.

    Teraz uogólnienie - jeden z wymnażanych sygnałów nie jest sinusem - pojawia się ryzyko wstrojenia się z którąś z harmonicznych, ALE jeżeli jesteśmy tego świadomi i znamy właściwe wartości podstawowych harmonicznych - to nie ma problemu...

    Haczyki tematu:
    PC-ty posiadają czasami znaczące odchyłki częstotliwości samplowania(lub odtwarzania) danych.
    Z własnego doświadczenia wiem, że najlepiej operować na wartościach 44100Hz lub 48000Hz.
    Odchyłki od wartości wzorcowych nie przekraczają 0,1Hz (Sprawdzone przez zdudnianie właśnie z generatorem DDS Agilenta - ustaliłem częstotliwości do 4 miejsc po przecinku).
    Niespodziankę zaliczyłem przy 8kHz, który pracował prawie na 8100Hz :) Dziwne, bo w końcu 8000 = 48000/6, a 48000 było OK...
  • Poziom 10  
    puciaken:
    Ja chyba nie do końca rozumiem jakie chcesz zbudować urządzenie, ale pomysł mam taki:
    1. długość okna analizy dobrać tak, aby miała kilka okresów tonu który badasz (mniej więcej, im więcej tym lepiej :)
    2. znaleźć lokalne maksima widma odpowiadające szukanej częstotliwości i jej harmonicznym - można to zrobić licząc pierwszą pochodną i wyznaczyć punkty przejścia przez zero lub zastosować zwykłą interpolację choćby wielomianem drugiego stopnia
    3. w tym punkcie masz przybliżone wartości częstotliwości szukanej oraz jej harmonicznych
    4. policzyć zwykłą średnia :) (oczywiście częstotliwości harmonicznych dzielimy przez numer harmonicznej) O ile sygnał jest mało zaszumiony to efekt powinien być odpowiedni

    Kwestia pozostaje tylko jedna, jeśli chcesz się stroić do częstotliwości w całym paśmie słyszalnym, to na przykład 20kHz też wchodzi w grę... Oj to będzie trudno, nie dostroisz do harmonicznych, sama interpolacja też niewiele pomoże. Można tak jak sugerowali koledzy korzystać z metod liczenia DFT w dowolnym punkcie (zero-padding algorytm Goertzla) i szukać maksimum.
    przy parametrach które podałeś wcześniej - 44,1 kHz fs i 16k fft rozdzielczość widma to około 2,7 Hz, stąd było pytanie o stabilność częstotliwości - jak masz na przykład dźwięk 16kHz to tych plus minus 30 Hz możesz nie usłyszeć, a omieciesz 60 prążków widma i cały misterny plan w .....

    Grzegorz:
    pomysł strasznie ciekawy, myślę sobie tylko jak to zrealizować programowo - bo jednak żeby osiągnąć taką dokładność to słuchawki chyba nie są najlepszym pomysłem ;)
    Skoro badana częstotliwośc jest mniej więcej znana, to nie problem jeśli sygnał wejściowy jest z harmonicznymi, zwykły filtr LP na częstotliwość 1.5 częstotliwości podstawowej i mamy sinus :)
    Nie wiem czy ja dobrze myślę, ale pomysł mam taki - mnożymy oba sygnały wejściowy i sztucznie wygenerowany (zakładamy że mamy podobne częstotliwości) -czyli dostaniemy sygnał modulowany w amplitudzie - wystarczy tak zmieniać częstotliwość sygnału sztucznego, aby po demodulacji (sygnał wejściowy to nośna więc nie powinno to być trudne) dostać jak najmniejszą energię. Demodulację można zrobić prymitywnie, filtrując filtrem dolnoprzepustowym sygnał będącymi wartościamy bezwzględnymi. Nie należy też dopuścić do przemodulowania, czyli sygnał sztuczny musi mieć kilka razy niższą amplitudę niż badany
    Późno już i nie wiem czy jakichś bzdur nie napisałem :)
  • Poziom 28  
    Przypomnę że już dla a razkreślnego 1 cent wynosi ok. 1/4 Hz.
    A w subkontrze sięgamy do 16Hz i tam jest to ok. 0.01 Hz - ciekaw jestem kto takie dudnienia na słuchawkach usłyszy.

    A może szanowni muzycy też nie słyszą i tam można gorzej stroić?
  • Poziom 27  
    Widzę, że niektórzy koledzy nie kumają idei dudnień. Nigdy nie bawili się radiem na falach długich, średnich, czy krótkich...

    Błąd 1/4Hz jest jak najbardziej do usłyszenia - po prostu głośność sygnału zmieni się z min na max w ciągu 2 sekund (+2 sekundy z max na min)...

    0.01Hz - nie problem. W ciągu 50 sekund głośność zmieni się z min na max i w ciągu kolejnych 50 w drugą stronę...

    To jedyny problem - im mniejszy ma być błąd tym dłuższy czas potrzebny na obserwację przebiegu zdudnionego...

    1/4Hz, czy 0,01Hz ro NIE są tony do usłyszenia o takiej częstotliwości, tylko szybkość zmiany głośności sygnału o dużej częstotliwości (ok. 2x częstotliwość badana).
  • Poziom 28  
    To skoro zaczynamy wycieczki osobiste to zacznę o sobie.
    Dla mnie dudnienia o okresie powyżej 5s są bardzo trudne do wychwycenia, szczególnie w warunkach zakłóceń i innych okoliczności w których muszę ich słuchać. I funkcjonują na zasadzie są/nie_ma, a nie jako precyzyjnie mierzalna wielkość.
    Strojenie ma tu następować z dokładnością do 1 centa czyli częstotliwość dudnień ma zostać sprowadzona do wartości niższych (co najmniej o połowę) od wartości dla 1 centa.
    Mamy do czynienia z instrumentem a nie idealnym oscylatorem więc mamy też alikwoty. I na to wszystko nakłada się problem wybrzmiewania, a właściwie całego kompletu ADSR.
    [nie wspomnę tu już jak może modulacja amplitudy wpłynąć na czystość dźwięku]
    Mimo dobrych chęci kolegów, nadal uważam że problem jest trudny do realizacji "na ucho" przynajmniej w dolnym zakresie częstotliwości i gotów jestem podejrzewać p.t. muzyków że ligawek i trombit nie stroją z dokładnością do 1 centa.
    Nie widzę natomiast istotnych ograniczeń w realizacji tego celu metodami DSP, ale raczej nie przez analizę częstości dudnień.
  • Poziom 10  
    Niektórzy doskonale rozumieją ideę dudnień, tylko kombinują jak by to zrealizować programowo a nie słuchawkami, żeby nie zbierać 50sek sygnału. Wydaje mi się że (a w zasadzie jestem pewien) że wystarczy kilka (4-5) okresów sygnału badanego (jak rozumiem z jakiegoś instrumentu) do tego żeby bardzo dokładnie określić częstotliwość drgań. Mój typ: 1. filtracja dolnoprzepustowa tylko częstotliwości podstawowej (tak żeby uzyskać w miarę czysty sinus) 2. Estymacja wstępna częstotliwości podstawowej, a jeśli jest to w niarę czysty sinus to problemu nie będzie, wystarczy policzyć liczbę próbek jednego okresu, a najlepiej kilku 3. No już najbardziej prymitywnie jak się da - generujemy sinusoidy (z dowolnym skokiem częstotliwości) i liczymy korelację pomiędzy sygnałem sztucznym a nagranym 4. Sinusoida dla której korelacja z nagranym sygnałem jest największa jest naszym typem
    Oczywiście można rzecz usprawniać i komplikować wręcz dowolnie, zależnie od charakteru sygnału wejściowego, ale powinno w miarę działać
  • Poziom 27  
    Zapomnijmy zatem o słuchawkach (nie będzie ryzyka sprzężeń zwrotnych).

    Wystarczy prosty oscyloskop programowy, gdzie będzie wszystko widać.
    Tak, spokojnie będzie widać 0.01 Hz,
    sprawdzałem to osobiście na wizualizacji w programie GoldWave - zdudniałem częstotliwości do 8 cyfr znaczących, co trochę trwało, ale dało się...

    Jeszcze prościej - najzwyklejszy w świecie programowy detektor szczytowy dla wymnożonego sygnału i pokazanie tego na jakimś pasku postępu.

    Płynącą powoli amplitudę obwiedni będzie widać...

    Max 1h pisania w Delphi, czy jakimś Visualu (generator sinusa o dowolnej częstotliwości [zadawane częstotliwości numerycznie, lub wręcz przy pomocy zapisu nutowego cdefgahc i isy i esy :)] + zbieranie próbek z wejścia mikrofonowego z ew. filtracją dolnoprzepustową w celu poprawienia SNR, mnożenie, detektor szczytowy, wynik na jakiś pasek postępu...

    Podstawiamy mikrofon pod instrument, zadajemy ton w aplikacji i stroimy instrument, aby uzyskać nieruchomy pasek postępu...

    Jeszcze prostsza idea: aplikacja rysująca figury Lissajous (X - wzorcowa częstotliwość, Y - z mikrofonu)... I strojenie na uzyskanie nieruchomego obrazka....

    Prościej się chyba nie da...

    Korelacja, FFT - to ból obliczeniowy mniejszy lub większy... I ryzyko błędów w kodzie...
  • Poziom 10  
    Żeby było jasne, Grzegorzu, oczywiście masz rację w tym co piszesz, różnimy się tylko podejściem - to co zaproponowałem to też analiza dudnień (w końcu mnożymy dwie sinusoidy i badamy wynikowy sygnał). Różnica polega na tym, że ja proponuję rozwiązanie bardziej złożone obliczeniowo za to dające możliwość uzyskania wyniku bez konieczności akwizycji dużej ilości danych. Ty proponujesz rozwiązania proste, wymagające co prawda ingerencji osoby mierzącej, ale za to mało skomplikowane obliczeniowo.
    Myślę że wybór konkretnej metody należy do autora tematu, w zależności od celu jaki chce osiągnąć.
  • Poziom 26  
    Dostałem od kolegi puciakena próbki sygnałów. O metodzie zdudnieniowej zapomnijcie. Niektóre z tych sygnałów mają pierwszą harmoniczną słabszą od 3. W każdym razie nie ma szans na metodę uniwersalną. Będzie tu konieczna interwencja operatora i odpowiedni wybór metody w zależności od sygnału. Myślę, że nie darmo stroiciele fortepianów i organów, to ludzie z ogromnym wieloletnim doświadczeniem kierujący się głównie słuchem, wyczuciem i zestawem kamertonów.
  • Poziom 10  
    Nic strasznego, że ton podstawowy nie jest dominujący. Ja akurat zajmuję się sygnałami mowy, tam mało kiedy ton podstawowy jest dominujący, a częstotliwość podstawową daje się spokojnie wykryć prawie zawsze, wiedząc jedynie że jest z zakresu 50-500Hz.
    Hehe, fortepian... trzeba było od razu :) Tak się zastaniawiałem jakimi to dziwnymi terminami się posługujecie :)
    To od razu upada pomysł z dostrajaniem do harmonicznych, w tego typu instrumentach harmoniczne mogą nie być dokładnie całkowitą wielokrotnością tonu podstawowego.
    Ale nadal podtrzymuję pomysł z filtracją dolnoprzepustową. Czy ja też mógłbym poprosić o przykładowe dźwięki? Chętnie się tym pobawię
  • Poziom 11  
    Nie przemawia coś do mnie metoda dudnień, chciałbym raczej aby częstotliwość została rozpoznana bezwzględnie. Przy niskich dźwiękach dudnienia będą bardzo powolne, przy b. wysokich ciężko będzie stwierdzić co tak naprawdę gra.
    Wiem, że określenie bezwzgl. częstotliwości jest możliwe i przy tym bardzo dokładne co widać choćby w Adobe Audition ale i w wielu innych programach. Raczej w stronę czegoś takiego bym się skłaniał.
    //pz78, napisz do mnie na mejla/gadu to Ci wyślę te próbki.