JAVA i mobiltelefon
JAVA i mobiltelefon
Hej!
Jag försöker bygga/programmera en enkel ljudmätare i JAVA så den skall fungera i de flesta mobiltelefoner på marknaden.
Tanken är att mobilens mikrofon skall registrera ljudet och tända upp tex små fyrkanter ju högre ljud man har.
tex 10 db tänder en fyrkant, 20 db tänder nästa osv...
Tanken är att använda detta som en enkel decibelmätare vid konserter m.m. som jag jobbar med.
Finns det någon som vet hur man skall/kan göra?
Jag specificerar mig lite.
Jag vill programmera ett JAVA-app som fungerar i tele för att mäta db på ett enkelt sätt. Nogrannheten är inte så viktig för telefonens JAVA-apps nogrannhet kommer stämmas av med en riktig och nogrann mätare innan användning.
Jag har inte hittat något på nätet eller i litteraturen om hur man använder telefonens inbyggda microfon i JAVA program för denna typ av ändamål.
Jag försöker bygga/programmera en enkel ljudmätare i JAVA så den skall fungera i de flesta mobiltelefoner på marknaden.
Tanken är att mobilens mikrofon skall registrera ljudet och tända upp tex små fyrkanter ju högre ljud man har.
tex 10 db tänder en fyrkant, 20 db tänder nästa osv...
Tanken är att använda detta som en enkel decibelmätare vid konserter m.m. som jag jobbar med.
Finns det någon som vet hur man skall/kan göra?
Jag specificerar mig lite.
Jag vill programmera ett JAVA-app som fungerar i tele för att mäta db på ett enkelt sätt. Nogrannheten är inte så viktig för telefonens JAVA-apps nogrannhet kommer stämmas av med en riktig och nogrann mätare innan användning.
Jag har inte hittat något på nätet eller i litteraturen om hur man använder telefonens inbyggda microfon i JAVA program för denna typ av ändamål.
Senast redigerad av erpesjo 24 juni 2007, 11:46:52, redigerad totalt 2 gånger.
"hur man ska/kan göra"?
Din fråga innefattar ju _väldigt_ många frågor, så du får nog precisera frågan lite. Är det att skriva en JAVA-app som är problemet eller är det att komma på själva algoritmen för ljudtrycksmätningen?!
Ett av de större problemen du kommer att få är att olika mobiltelefoner har olika mikrofoner, mickförstärkare och AD-omvandlaren.
Ditt mätvärde kommer alltså bero helt på vilken telefon du använder. För att kunna beräkna dB måste du veta mikrofonens känslighet, mickförstärkarens gain samt lite detaljer kring AD-omvandlaren för varje enskild telefonmodell.
Din fråga innefattar ju _väldigt_ många frågor, så du får nog precisera frågan lite. Är det att skriva en JAVA-app som är problemet eller är det att komma på själva algoritmen för ljudtrycksmätningen?!
Ett av de större problemen du kommer att få är att olika mobiltelefoner har olika mikrofoner, mickförstärkare och AD-omvandlaren.
Ditt mätvärde kommer alltså bero helt på vilken telefon du använder. För att kunna beräkna dB måste du veta mikrofonens känslighet, mickförstärkarens gain samt lite detaljer kring AD-omvandlaren för varje enskild telefonmodell.
dB är iofs ett relativt värde - den beskriver bara en 10-logaritmiserad kvot mot något.
Första steget är att övh. komma åt AD-omvandlarvärdena och veta om de är linjära eller A eller u-Law komprimerade - då de sistnämda måste avkomprimeras innan beräkningarna. - fins det någon analog ljudkompressor/adaptiv dämpare före A/D-omvandlaren och inte kommer åt dess värden så kan du inte göra en rättvisande dB-mätare hur mycket program du än skriver...
I brist på referenser så kan man göra som i audio-världen säga att full utstyrning (dvs. +/- 32767 på en 16 bits AD-omvandlare) motsvarar 0 dB och svagare nivåer blir minusvärden - dvs -96 dB som lägst - skriker man och det klipper så visar det 0 dB....
Börja att få ovanstående att fungera först innan du jagar 'riktiga' dB - den dan du kan jämföra uppgivna dB-värden i telefonen med en riktig ljud-dB mätare, så kan du lätt införa en offset på telefonens angivna dB-värden så att det visar samma sak som ljud dB-mätaren - den här offsetkonstanten kommer att vara olika för olika telefoner. räkna också med att AD-omvandlarna har en switchcap-filter på ingången och mäter bara inom området 300-3400 Hz med mycket branta skärningar (dämpning) av frekvenserna över och under dessa frekvenser mao. kan du inte se hur mycket bastryck det är framför bashornen på en konsert...
Obs - mät på bara 1000 Hz vid kalibrering - att införa A,B,eller C-vikt på kurvan (för att simulera örats lägre känslighet på låga och höga frekvenser) som många ljud-dB mätare har, kan du inte göra i telefonen då det kräver mycket DSP-resurser i realtid på inkommande ljud och görs knappast i java.
Sådan filtrering gör analogt med bara några kondingar, induktanser och motstånd (på liknande sätt som RIAA-filter i en förstärkare för signal från en skivspelare) i en ljud-dB mätare men är ett helsike att simulera samma sak med programmvara och ha DSP-resurser typ i en telefon...
---
Eftersom det är spänning som AD-omvandlarna mäter i så är omvandlingsormeln på toppvärden (absolutvärde) av inkommande samplen
enligt
dB = 20 * log10(abs(inkommande AD-värden)/32767)
om AD-omvandlaren är 16 bit med området +/-32767 som max.
därefter kan du addera eller subrahera dB-värde med en offset så att det stämmer mer en riktig ljud-dB mätare vid 1000 Hz testtoner.
Första steget är att övh. komma åt AD-omvandlarvärdena och veta om de är linjära eller A eller u-Law komprimerade - då de sistnämda måste avkomprimeras innan beräkningarna. - fins det någon analog ljudkompressor/adaptiv dämpare före A/D-omvandlaren och inte kommer åt dess värden så kan du inte göra en rättvisande dB-mätare hur mycket program du än skriver...
I brist på referenser så kan man göra som i audio-världen säga att full utstyrning (dvs. +/- 32767 på en 16 bits AD-omvandlare) motsvarar 0 dB och svagare nivåer blir minusvärden - dvs -96 dB som lägst - skriker man och det klipper så visar det 0 dB....
Börja att få ovanstående att fungera först innan du jagar 'riktiga' dB - den dan du kan jämföra uppgivna dB-värden i telefonen med en riktig ljud-dB mätare, så kan du lätt införa en offset på telefonens angivna dB-värden så att det visar samma sak som ljud dB-mätaren - den här offsetkonstanten kommer att vara olika för olika telefoner. räkna också med att AD-omvandlarna har en switchcap-filter på ingången och mäter bara inom området 300-3400 Hz med mycket branta skärningar (dämpning) av frekvenserna över och under dessa frekvenser mao. kan du inte se hur mycket bastryck det är framför bashornen på en konsert...
Obs - mät på bara 1000 Hz vid kalibrering - att införa A,B,eller C-vikt på kurvan (för att simulera örats lägre känslighet på låga och höga frekvenser) som många ljud-dB mätare har, kan du inte göra i telefonen då det kräver mycket DSP-resurser i realtid på inkommande ljud och görs knappast i java.
Sådan filtrering gör analogt med bara några kondingar, induktanser och motstånd (på liknande sätt som RIAA-filter i en förstärkare för signal från en skivspelare) i en ljud-dB mätare men är ett helsike att simulera samma sak med programmvara och ha DSP-resurser typ i en telefon...
---
Eftersom det är spänning som AD-omvandlarna mäter i så är omvandlingsormeln på toppvärden (absolutvärde) av inkommande samplen
enligt
dB = 20 * log10(abs(inkommande AD-värden)/32767)
om AD-omvandlaren är 16 bit med området +/-32767 som max.
därefter kan du addera eller subrahera dB-värde med en offset så att det stämmer mer en riktig ljud-dB mätare vid 1000 Hz testtoner.
- JimmyAndersson
- Inlägg: 26415
- Blev medlem: 6 augusti 2005, 21:23:33
- Ort: Oskarshamn (En bit utanför)
- Kontakt:
erpesjo:
"Jag har inte hittat något på nätet eller i litteraturen om hur man använder telefonens inbyggda microfon i JAVA program för denna typ av ändamål."
Söker man på google så finns massor med sidor om Java och ADConverter när det gäller datorer. En idé kanske vore att få det att fungera i datorn först, så att du får grepp om hur koden ska se ut och därefter modifiera så koden passar mobilen.
"Jag har inte hittat något på nätet eller i litteraturen om hur man använder telefonens inbyggda microfon i JAVA program för denna typ av ändamål."
Söker man på google så finns massor med sidor om Java och ADConverter när det gäller datorer. En idé kanske vore att få det att fungera i datorn först, så att du får grepp om hur koden ska se ut och därefter modifiera så koden passar mobilen.
Hej!JimmyAndersson skrev:erpesjo:
"Jag har inte hittat något på nätet eller i litteraturen om hur man använder telefonens inbyggda microfon i JAVA program för denna typ av ändamål."
Söker man på google så finns massor med sidor om Java och ADConverter när det gäller datorer. En idé kanske vore att få det att fungera i datorn först, så att du får grepp om hur koden ska se ut och därefter modifiera så koden passar mobilen.
Tack för ditt inlägg.. jag har redan en fungerande version i datorn.
Men den är skriven i en programkod som inte fungerar i tele... och jag vill slippa släpa med mig den bärbara datorn.. då kan jag lika gärna släpa med mig den bärbara dB mätaren.... ville ha det enkelt med allt i mobben..
Nogrannheten är ju inte så viktig.. det handlar mest om att se att man inte ligger över vissa tillåtna värden i stort... jag vet att nogrannheten inte kommer vara så bra med mobilen, men man kan jämföra med den riktiga dB mätaren och se var gränserna går.
Hälsningar
Fredrik
Hej och ett stort tack för dina imponerande kunskaper i ämnet.xxargs skrev:dB är iofs ett relativt värde - den beskriver bara en 10-logaritmiserad kvot mot något.
Första steget är att övh. komma åt AD-omvandlarvärdena och veta om de är linjära eller A eller u-Law komprimerade - då de sistnämda måste avkomprimeras innan beräkningarna. - fins det någon analog ljudkompressor/adaptiv dämpare före A/D-omvandlaren och inte kommer åt dess värden så kan du inte göra en rättvisande dB-mätare hur mycket program du än skriver...
I brist på referenser så kan man göra som i audio-världen säga att full utstyrning (dvs. +/- 32767 på en 16 bits AD-omvandlare) motsvarar 0 dB och svagare nivåer blir minusvärden - dvs -96 dB som lägst - skriker man och det klipper så visar det 0 dB....
Börja att få ovanstående att fungera först innan du jagar 'riktiga' dB - den dan du kan jämföra uppgivna dB-värden i telefonen med en riktig ljud-dB mätare, så kan du lätt införa en offset på telefonens angivna dB-värden så att det visar samma sak som ljud dB-mätaren - den här offsetkonstanten kommer att vara olika för olika telefoner. räkna också med att AD-omvandlarna har en switchcap-filter på ingången och mäter bara inom området 300-3400 Hz med mycket branta skärningar (dämpning) av frekvenserna över och under dessa frekvenser mao. kan du inte se hur mycket bastryck det är framför bashornen på en konsert...
Obs - mät på bara 1000 Hz vid kalibrering - att införa A,B,eller C-vikt på kurvan (för att simulera örats lägre känslighet på låga och höga frekvenser) som många ljud-dB mätare har, kan du inte göra i telefonen då det kräver mycket DSP-resurser i realtid på inkommande ljud och görs knappast i java.
Sådan filtrering gör analogt med bara några kondingar, induktanser och motstånd (på liknande sätt som RIAA-filter i en förstärkare för signal från en skivspelare) i en ljud-dB mätare men är ett helsike att simulera samma sak med programmvara och ha DSP-resurser typ i en telefon...
---
Eftersom det är spänning som AD-omvandlarna mäter i så är omvandlingsormeln på toppvärden (absolutvärde) av inkommande samplen
enligt
dB = 20 * log10(abs(inkommande AD-värden)/32767)
om AD-omvandlaren är 16 bit med området +/-32767 som max.
därefter kan du addera eller subrahera dB-värde med en offset så att det stämmer mer en riktig ljud-dB mätare vid 1000 Hz testtoner.
Jag har som du ser i ett annat inlägg redan en fungerande version till min bärbara PC. Men jag ville testa om det går att få ned den i mobilen för enkelhetens skull. Nogrannheten är absolut inte så viktig, det handlar mest om att se att man inte överskrider vissa värden som man har testat av paralellt med den riktiga dB mätaren.
Men jag hittar inte någonstans hur man kan få tillträde till mikrofonen i JAVA och därigenom visa upp någon form av feedback på skärmen av uppmätta värden.
Hälsningar
Fredrik
- JimmyAndersson
- Inlägg: 26415
- Blev medlem: 6 augusti 2005, 21:23:33
- Ort: Oskarshamn (En bit utanför)
- Kontakt:
"det handlar mest om att se att man inte ligger över vissa tillåtna värden i stort..."
När man spelar på gränsen till de tillåtna värdena så har den stackars mobil-mikrofonen (med tillhörande elektonik) redan fått nog för länge sedan, så det blir nog dessvärre inte helt lätt.
Men det går att bygga en liten dB-mätare med kretsen LM3916. Med ett mikrofonelement som klarar ljudtrycket och en liten förstärkarkrets så blir det lättare och går fortare än att hitta rätt Java-dokumentation för mobilen. Storleken på det hela behöver inte bli större än en halv mobiltelefon.
När man spelar på gränsen till de tillåtna värdena så har den stackars mobil-mikrofonen (med tillhörande elektonik) redan fått nog för länge sedan, så det blir nog dessvärre inte helt lätt.
Men det går att bygga en liten dB-mätare med kretsen LM3916. Med ett mikrofonelement som klarar ljudtrycket och en liten förstärkarkrets så blir det lättare och går fortare än att hitta rätt Java-dokumentation för mobilen. Storleken på det hela behöver inte bli större än en halv mobiltelefon.
JimmyAndersson: han vill ha en dB mätare på mobilen, då hjälper inte LM3916.
erpesjo: Olika tillverkare har olika SDK för sina mobiler, här har du några:
Sony-Ericsson
Nokia
Motorola
Söker du på "+JAVA +[tillverkare] +SDK" så får du upp fler...
Dom flesta tillverkare har forum (eller motsvarande) där du kan fråga om sånt här.
Lycka till!
erpesjo: Olika tillverkare har olika SDK för sina mobiler, här har du några:
Sony-Ericsson
Nokia
Motorola
Söker du på "+JAVA +[tillverkare] +SDK" så får du upp fler...
Dom flesta tillverkare har forum (eller motsvarande) där du kan fråga om sånt här.
Lycka till!
- JimmyAndersson
- Inlägg: 26415
- Blev medlem: 6 augusti 2005, 21:23:33
- Ort: Oskarshamn (En bit utanför)
- Kontakt:
"han vill ha en dB mätare på mobilen, då hjälper inte LM3916."
Jag vet.
Men han vill kunna se så att han inte ligger över tillåtna värden. Vid dessa nivåer blir de flesta mobilmikrofoner kraftigt "mättade" eftersom de är avsedda att hållas en bit ifrån munnen. Alltså skulle han behöva dämpa ljudet som når mikrofonen och då blir hela avläsningen fel.
Det var någon som lade upp ett ljudklipp här, inspelat med en mobil på ett disco. Leta upp den tråden så kommer du höra hur det blir om man försöker använda en mobiltelefon med "standardmick" till detta. De mobiler med dB-mätare har med stor sannorlikhet en annan typ av mikrofon.
Jag vill inte förstöra idén med att fixa en egen dB-mätare i mobilen, jag skulle själv gärna vilja ha en sådan. Men då jag inte är helt grön vad gäller mikrofoner så ser jag begränsningar med detta projekt. Tyvärr.
Med kretsen jag föreslog så skulle man däremot kunna bygga en *bra* dB-mätare på några timmar.
Jag vet.

Det var någon som lade upp ett ljudklipp här, inspelat med en mobil på ett disco. Leta upp den tråden så kommer du höra hur det blir om man försöker använda en mobiltelefon med "standardmick" till detta. De mobiler med dB-mätare har med stor sannorlikhet en annan typ av mikrofon.
Jag vill inte förstöra idén med att fixa en egen dB-mätare i mobilen, jag skulle själv gärna vilja ha en sådan. Men då jag inte är helt grön vad gäller mikrofoner så ser jag begränsningar med detta projekt. Tyvärr.
Med kretsen jag föreslog så skulle man däremot kunna bygga en *bra* dB-mätare på några timmar.
När jag håller på med sådant här så brukar jag ha med min kompakta dB-mätare, en sådan här:
http://www.pacer-ind.com/Product-Detail ... ?ItemID=36
kompaktare än dom flesta stora bulkiga dB-mätare, ungefär lika bred och tjock som en nokia 3310, men ett par cm längre...
En mätare i den storleken är inget större problem att ha med sig i bälteshölster om man nu jobbar med konserter som du gör?
Det borde finnas någon modernare motsvarighet som inte är från 1980 och kanske ännu kompaktare?
http://www.pacer-ind.com/Product-Detail ... ?ItemID=36
kompaktare än dom flesta stora bulkiga dB-mätare, ungefär lika bred och tjock som en nokia 3310, men ett par cm längre...
En mätare i den storleken är inget större problem att ha med sig i bälteshölster om man nu jobbar med konserter som du gör?
Det borde finnas någon modernare motsvarighet som inte är från 1980 och kanske ännu kompaktare?
det är väl för sig inget som hindrar att man sätter en akustisk dämpsats i mikrofon-hålet (dbs en plugg) - men frekvensgången och hur mycket det dämpar efter varje montering är nog ganska oförutsägbart.JimmyAndersson skrev:"han vill ha en dB mätare på mobilen, då hjälper inte LM3916."
Jag vet.Men han vill kunna se så att han inte ligger över tillåtna värden. Vid dessa nivåer blir de flesta mobilmikrofoner kraftigt "mättade" eftersom de är avsedda att hållas en bit ifrån munnen. Alltså skulle han behöva dämpa ljudet som når mikrofonen och då blir hela avläsningen fel.
det som är mer 'oroande' är nog att man inte mäter dom fekvenser i bas och diskant som ställer till värst bekymmersmässigt avseende buller mot grannskapet och avseende hörselskadefaran.
Dock hade det varit bra om nallen kunde mäta när den inte ringde med full bandbredd (filtren i AD-omvandlaren går nästa alltid att koppla ut - i allafall var det så på dom dackarna som användes i telefonmodem - och där var det 14-bitars omvandlare... ) - med en lämplig application som filtrerar rätt så skulle man kunna göra en reminder/varningsapplication som varnade när
man började nå gränsen för risk för hörselskada.
problemet är väl att API-erna inte tillåter sådana råa dataflöden direkt från AD-omvanldlarna misstänker jag...
> med en lämplig application som filtrerar rätt så skulle man kunna göra en reminder/varningsapplication som varnade när
man började nå gränsen för risk för hörselskada.

Finns ett enkelt sätt att göra det. Gör så att den varnar hela tiden. Gränsen ligger väl ändå typ vid 95dB eller något sånt? Det är ju inte sådär jättehögt.
Fast sen kanske man kan använda en lite mer realistisk gräns såklart.
man började nå gränsen för risk för hörselskada.

Finns ett enkelt sätt att göra det. Gör så att den varnar hela tiden. Gränsen ligger väl ändå typ vid 95dB eller något sånt? Det är ju inte sådär jättehögt.
