Sound etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
Sound etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

22 Mayıs 2020 Cuma

Müzik Teknolojisi

Giriş
Ses ve müzik teknolojisi görüntü işleme kadar büyük bir hızla ilerliyor. Aşağıda ses ve müzik teknolojisi hakkında aldığım genel notlarım var.

RF ve Ses Dalgası
Açıklaması şöyle.
An RF signal can have the same frequency as a sound wave, and most people can hear a 5 kHz audio tone. No one can hear a 5 kHz RF signal.
Kulaklarımız elektro manyetik dalgaları duyamıyor. Açıklaması şöyle. Ancak gözlerimiz elektromanteyik dalga olan ışığı görebiliyor. Onlar da belli bir araşığı görebiliyor.
The audio tone is compression waves traveling through air that your ears can pick up. The RF signal is waves in the electromagnetic field that you ears have no way of picking up.
Sound Generator
İlk ses kartlarında noise generator bileşeni vardı. Bu kartlar  square wave, pulse wave, triangle wave, sawtooth wave gibi tone'ları üretebiliyordu

Audio Jack
Ses çıkışı TSR (Tip, Ring, Sleeve) veya TRS (Tip, Ring, Ring, Sleeve) olabilir.

PCM
PCM basit bir şekilde analog sesin dijital hale getirilmiş şeklidir. Raw bitstream olarak düşünülebilir. Analog ses bir sürekli değişen bir dalga olduğu için sonsuz bilgi içerir. Bu bilgisi dijital hale getirmek için belli aralıklarla örnekler almak gerekir.
samples

Compressed müzik dosyalarında - örneğin MP3 - her zaman kayıp vardır. Ancak bu kayıp fark edilemeyek kadar küçük olabilir. Sıkıştırma algoritmaları farklı farklı şekillerde çalışıyorlar.

Basit bir algoritma yukarıdaki şekildeki birbirlerine çok yakın oldukları için 5T ve 6T değerlerinden sadece birini kaydedebilir.

Audio Feedback
Özellike video konferanslarda sesin gürültü haline gelere sürekli yükselmesidir. Açıklaması şöyle. Çare mikrofonu kapatmaktır :)
This phenomenon is called audio feedback which usually occurs when the sound from the speakers reaches back into the microphone, and then gets amplified because of the speaker-mic loop.

Common and general solutions are to cut off the loop, or at least reduce the loop gain by:

1- Wearing earphone or headphone (isolate the speaker and the mic, prevent the feedback loop completely)
2- Mute the mic when not needed to speak (prevent the chance of feedback loop)
3- Reduce the speaker volume (reduce the volume gain)
4- Take some distance between the speakers (reduce the volume gain)

WAVE Dosya Formatı
Wave dosya formatı uncompressed ve lossless bir formattır. Wave formatı aslında jenerik bir container format olarak düşünülebilir fakat genellikle PCM verisi içerir. CD'lerde Wave dosyaları görülebilir.

WAVE dosya formatı başlık + veri şeklinde tasarlanmış.
1. Dosya önce şöyle RIFF Header ile başlar.
'R', 'I', 'F', 'F'
Arada anlamadığım bazı bilgiler var. RIFF Header WAVE kelimesi ile sonlanır
'W', 'A', 'V', 'E'
Yani şöyle bir yapıdır.
typedef struct  WAV_HEADER
{
   uint8_t         RIFF[4];        // RIFF
   uint8_t         WAVE[4];        // WAVE
}

2. Format Header
Format Header şöyle başlar
'f', 'm', 't', ' '
Buraya şu bilgiler yazılır
Subchunk1Size = 16;
AudioFormat = 1
NumberOfChannels = 2
SampleRate = 44100
ByteRate
BlockAlign
BitsPerSample = 16

Yukarıdaki bilgiler ışığında bazı alanları anlamak mümkün.
Sample Rate  : Kaç Hz ile örnekleme yapıldığını gösteriyor. Bu genellikle 44,100'dür
Bits Per Sample : Her örnekte kaç bit olduğunu gösterir.
Num Channel : Her örneğin aslında kaç kanalın birleşimi olduğunu gösterir. En fazla 18 kanal olabilir. Kanallar örneklerde şöyle görünür.
[1st L] [1st R] [2nd L] [2nd R]...
Yani iki kanal varsa, örneğin yarısı sağ,diğer yarısı ise sol kanaldan gelmektedir.

3. Data Header
Data Header şöyle başlar
'd', 'a', 't', 'a'
Arkasından ses verisi gelir.

Wave dosyaları sıkıştırılmamış oldukları için büyüktürler. 5 dakikalık bir kayıt için
  • 16-bit, 44.1kHz: 50 MB
  • 24-bit, 48kHz: 82 MB
  • 24-bit, 96kHz: 164 MB

büyüklüğünde veri çıkabilir. Bu büyüklüğü mp3 ile kıyaslayınca sıkıştırmanın ne kadar önemli olabileceği görülebilir.

Windows'ta wav dosyası çalmak için PlaySound() çağrısı kullanılabilir.


19 Temmuz 2019 Cuma

ALSA

Speaker
Eski PC'lerde speaker bulunurdu. Speaker yerine daha sonra buzzer'lar geldi.

Bu speaker Windows'ta Beep () metodu ile ses çıkarırdı.
Bu metod kaldırıldı sonra yeniden eklendi. Şöyle kullanılır.
Beep(261, 100)
Beep yerine MessageBeep kullanılabilir.

Intel 8254 Çipi
Açıklaması şöyle.
The original IBM PC and later variants used an Intel 8253 or 8254 as a sound chip.
Bu çipte 3 tane timer var. Bunlardan bir tanesi ses için kullanılabiliyor. Açıklaması şöyle
The 8253 is a timer circuit, containing three timers able to generate timed interrupts or square-wave output with programmed frequencies. On the PC the third timer's output is, via an amplifier, connected to a simple speaker.
Beep metodu 8254 programlanabilir çipini kullanarak belli bir frekansta belli bir süre ses çıkartmak içindi. Metodun frequency parametresinin açıklaması şöyle
Also, the only frequencies that can be selected are those that result from dividing the base frequency (1,193,181.8 Hz) by an integer in the range of 1–65535.
8254 aynı zamanda monotonic saatlerde de kullanılır.

Speaker Yerine Ses Kartı
Speaker kullanarak ses kartının işlevini gerçekleştirme denemeleri de oluyordu. Bu speaker'ı hızlıca açıp kapayarak yapılıyordu. Açıklaması şöyle.
it's really only designed to make beeps of various frequencies, all the same volume level. But by quickly turning the speaker on and off, you can play 1-bit PCM audio.
Tabi ses doğal gelmiyordu kulağa. Açıklaması şöyle
Since it's a digital output, no level control is available. Only on or off is possible. At best this results in rather nasty sounding square waves. There is no provision to smooth the signal (beside the inertia of the speaker membrane).
Bir ses kartı ise farklı işleve sahiptir. Açıklaması şöyle
A sound chip will need programmable oscillators for different wave forms and at least some analogue ciruitry to make a smooth, more natural sound.
Ses Kartı Yerine GPU
GPU'da ses işlemi için kullanılamiyor. Açıklaması şöyle
Sorry, going to disappoint you straight away. I have tried using NVidia CUDA (the native library) for audio processing, using neural networks. It's what my company does for a living, so we're pretty competent. We found that the typical NVidia card has too much latency. They're fast, that's not the problem, but that means they can do many million operations in a millisecond. However, the DMA engine feeding data to the card typically has latencies that are many milliseconds. Not so bad for video, bad for audio - video often is 60 Hz whereas audio can be 48000 Hz.
Nyquist Teoremi
Nyquist Teoremi yazısına taşıdım.

Örnekleme Frekansı
Örnekleme frekansı (rate) sesi kaydederken veya sesi çalarken kullanılır. Örnekte Raspberry Pi cihazında rate görülebilir.
$ cat /proc/asound/card0/pcm0p/sub0/hw_params 
access: RW_INTERLEAVED
format: S16_LE
subformat: STD
channels: 2
rate: 48000 (48000/1)
period_size: 4096
buffer_size: 16384
Ses kalitesi daha iyi olsun istenirse daha yüksek örnekleme frekansı kullanılabilir. Örneğin çok kullanılan frekanslar 8,000, 11,025, 16,000, 22,050, 24,000, 32,000, 44,100, ve 48,000 Hz'dir.

Örneğin 44,100 Hz  ile örnekleme yaparsak insan kulağının hassasiyetine göre en düşük 100 ve 600 Hz ile en yüksek  20,000 ve 20,500 Hz'lik sesleri duyarız diye anlıyorum.

44,100 Hz 22.05 Hz genişliği ile insan kulağının duyabileceğinden az bir şey daha fazlasını örnekliyor. Bu rakam 2'nin katı olduğu için ve çiplerin geliştirmesinde kolaylık sağlayacağı için Sony tarafından seçilmiş.
44100 = 2^2 * 3^2 * 5^2 * 7^2

ALSA ile örnekleme frekansını atamak için snd_pcm_hw_params_set_rate_near() metodu kullanılabilir.Örnek:
snd_pcm_hw_params_t *hwparams;
snd_pcm_hw_params_alloca(&hwparams);

unsigned int rrate = 44100;
snd_pcm_hw_params_set_rate_near(handle, params, &rrate, 0);
Örnekleme Büyüklükleri
Yukarıda 8 bitlik bir büyüklükten bahsettik ancak ses kalitesini artırmak için 8, 16, 20 veya 24 bitlik örnekleme büyüklükleri de kullanılabilir.

PCM
Pulse-code modulation yani PCM, (G.711 olarak ta bilinir) 64Kbps data olarak sayısallaştırılmış ses sinyalidir. Ses sıkıştırması için de G.729 codec'i kullanılır.

Java
Audio yazısına taşıdım.