Sida 1 av 2

Kycklingkvitter från uC?

Postat: 23 mars 2010, 23:42:28
av bearing
Försöker skapa kycklingkvitter med en liten uC. Tycker att det borde gå att hitta mönster i ljudet som gör att man inte behöver spara ett en hel "wav-fil" i flash (får antagligen inte plats) utan kan generera ljudet genom kod.

Hittade en video på nyfödd kyckling på youtube, och spelade in ljudet. Isolerade ett pip i chirp_16bit_44khz.wav. Det mesta ljudet verkar finnas inom 3000-12000 Hz.

http://dl.dropbox.com/u/770240/kyckling ... _44khz.wav
http://dl.dropbox.com/u/770240/kyckling ... _44khz.wav

Har tittat på ljudvågorna i Audacity, men ser inget mönster. Tror att man kan komma närmare lösningen genom att göra någon sorts frekvensanalys, men jag vet inte hur man gör.

Har ni några idéer?

Re: Kycklingkvitter från uC?

Postat: 24 mars 2010, 15:41:13
av hatten
Matlab är den samplade signalens bästa vän! Här kommer tolv rader kod som transformerar ljudklippen till frekvensdomänen.

Kod: Markera allt

filenames = {'chirps_16bit_44khz', 'chirp_16bit_44khz'};
for i=1:2
    [data, fs] = wavread(filenames{i});   % importerar
    nfft = 2^(nextpow2(length(data))-1);  % justerar datalängden
    Y{i} = fft(data,nfft);                % transformerar
    Y{i} = Y{i}/max(Y{i});                % normaliserar
    f{i} = fs/2*linspace(0,1,nfft/2);     % div plotgrejs.. 
    subplot(2,1,i), plot(f{i},abs(Y{i}(1:nfft/2)));
    xlim([0 10e3]); 
    title(filenames(i));
end
xlabel('Frequency (Hz)');
Vilket i sin tur producerar denna bild.

EDIT; Upptäckte just att Matlab formaterade titlarna lite lustigt. Den övre plotten visar alltså frekvensspektrat för det längre klippet, där även mänskligt tal var med, och den undre plotten svarar mot det korta klippet som bara innehöll ett pip.

Re: Kycklingkvitter från uC?

Postat: 24 mars 2010, 16:54:30
av E85
Det går att titta på spectrogram i Audacity om du klickar på namnet bredvid krysset uppe till vänster (track pop-down menu) på spåret och väljer Spectrum.

Re: Kycklingkvitter från uC?

Postat: 24 mars 2010, 22:08:20
av bearing
Tack för hjälpen, Matlab-funktionerna verkar intressanta! Tyvärr har jag inte tillgång till Matlab.
Det jag skulle vilja göra är att dela upp pipet i typ 100 delar, och sedan hitta frekvenstoppen på varje del. Då skulle jag kunna få en sorts frekvens över tid-kurva.

Jag provade nu att göra den analysen manuellt i Audacity genom att markera korta delar av chirp_16bit_44khz.wav, och sedan köra FFT på den, successivt genom hela filen.

Fick fram att ljudet består av tre faser:
1. Ramp 4,5 kHz till 5 kHz i 15 ms
2. 5kHz i 100ms
3. Ramp 5kHz ner till 3 kHz i 50 ms

Provade att programmera en sån sekvens med fyrkantvåg i en PIC. Låter ganska risigt. Men ljudet kan nog accepteras som kycklingkvitter om högtalaren placeras i något som liknar en kyckling.

Ska försöka fixa så att även volymdynamiken ingår i sekvensen. Det kommer nog ge lite bättre resultat.

Re: Kycklingkvitter från uC?

Postat: 25 mars 2010, 02:52:53
av JimmyAndersson
Fyrkantvågen har lite för "perfekta" övertoner, så det blir lite stelt ljud.
Dista den lite eller kör med triangelvåg så kan det bli bättre.

Sånt här kvitter gör man enklast genom att börja med en hög ton (hög frekvens) som man sedan sänker linjärt under hela tiden som pipet pågår (t.ex 1/5 sekund). Snyggast blir det om man även har ett resonansfilter (eller åtminstone högpassfilter) som också sänks frekvensmässigt under samma tid, men det är överkurs. :)

För att öka realismen så kan man variera start-frekvensen på varje pip, men det får inte ändras för mycket på en gång.
Volymen går förstås också att ändra. Den kan man isåfall ändra ganska kraftigt (men långsamt) från pip till pip.

Hur man fixar det med kod vet jag inte såhär på rak arm. Jag bara hör beståndsdelarna i ljud, jag ser ingen kod. :D
(Däremot har jag en gång gjort fågelkvitter med 3st 741-kretsar.)


Berätta gärna hur det går och lägg upp ljudklipp om du vill.

Re: Kycklingkvitter från uC?

Postat: 25 mars 2010, 08:36:04
av bearing
Aha! jag provade med ton på 5 kHz som sänktes linjärt ner till 3 kHz under 100ms, och det låter riktigt fågellikt. Verkar som att den nedåtgående rampen är det viktigaste för att det ska låta fågellikt. Kycklingpipet innehåller även en fast ton just innan rampen.

Det här är del av årets påskpyssel, där en PIC ska driva en liten högtalare direkt via ett motstånd. Har inte möjlighet att dista ljudet eller något sånt. Får klara mig med fyrkantvågen.

Men nu är jag ganska nöjd!
Med både någorlunda lik frekvensgång och "envelope" (tror jag det kallas, alltså variationen av amplituden/volymen under pipet) låter det ganska likt. Det som saknas är de "krispigaste" komponenterna i ljudet, vilket hörs om man jämför med inspelade kycklingljudet som länkas ovan.

http://dl.dropbox.com/u/770240/kyckling/result.wav

Recept:
1. Ramp 4,5 kHz till 5 kHz i 50 cykler 50% volym
2. 5kHz i 250 cykler 50% volym
3. Ramp 5kHz ner till 3 kHz i 250 cykler 100% volym
4. Tyst ca ½ sekund

(Det första steget kan man nog hoppa över)

Kan publicera koden senare när jag provat mer.

Re: Kycklingkvitter från uC?

Postat: 25 mars 2010, 10:04:46
av Nerre
Om frekvensområdet är någorlunda smalt (och det verkar det ju vara?) så borde du ju kunna lågpassfiltrera relativt enkelt med kanske bara en konding parallellt med högtalaren? Då får du bort en del av övertonerna.

Re: Kycklingkvitter från uC?

Postat: 25 mars 2010, 17:48:52
av E85
Varför kollade du inte på spectrogrammet då som jag tipsade om? Syns väldigt tydligt i det.

Bild

Re: Kycklingkvitter från uC?

Postat: 25 mars 2010, 20:25:05
av bearing
Därför att du inte berättade var i programmet man får fram det. Jag trodde du syftade på analyze->plot spectrogram, vilket jag använde genom att markera bit för bit genom hela klippet. Nu hittade jag spectrogrammet du syftade på, och det verkar ju vara klockrent för det här. Fast mitt spectrogram ser inte ut som din bild. Skalan går bara till 7kHz, och har inte några delsteg. Hur ändrar jag det?

Re: Kycklingkvitter från uC?

Postat: 25 mars 2010, 20:28:37
av E85
Hmm, ja lite dåligt förklarat kanske men jag sa ju var man hittade det. :vissla:
Jag har inte ändrat några andra inställningar så jag vet inte riktigt vad det kan bero på.

Re: Kycklingkvitter från uC?

Postat: 25 mars 2010, 20:41:00
av bearing
Nu efteråt verkar din beskrivning om var min hittar spektrogramet bra, så jag förstår inte varför jag inte förstod direkt.

Vilket version har du?
1.2.6 här

Under edit->preferences->spectrograms kunde jag knappa in 20000kHz maxfrekvens, men där fanns inga inställningar för delstegen.

Re: Kycklingkvitter från uC?

Postat: 25 mars 2010, 20:44:19
av E85
Jag har version 1.3.11-beta (rekommenderas framför 1.2 stable för Win7/Vista på deras hemsida). Såg den inställningen också men min stod på max 8000Hz så vet inte vad den inställningen gör riktigt.

Re: Kycklingkvitter från uC?

Postat: 25 mars 2010, 21:04:00
av bearing
La in 1.3.11 beta nu och fick delstegen. Fanns mer inställningar i preferences också.

Re: Kycklingkvitter från uC?

Postat: 25 mars 2010, 22:21:51
av wombat
Superbra! :tumupp:

Visade sambon tråden.
Hennes kommentar:
-"Nördar!" :D
Men hon köpte ljudet rakt av.
Spelade det först.
-"Vad är det där för fågel?" :D

Är intresserad av att se koden.
Håller själv på med ljudalstring från PIC 10F200.
Mest melodispel än så länge, men det vore roligt
att göra mera komplexa ljud.
Lite meckigt dock i och med att jag kör ljudalstringen
parallellt med pwm till 4 lysdiodgrupper. Skall funka,
dock inte just nu. :doh:

/W

EDIT>Ehhh, receptet räcker ju insåg jag precis. :roll: Mn rol å se kodn ennå! :D

Re: Kycklingkvitter från uC?

Postat: 25 mars 2010, 22:44:41
av Gimbal
:tumupp: det lät ju riktigt bra.