web-dev-qa-db-ja.com

Pythonで.wavファイルの頻度を取得しようとしています

Python=内の.wavファイルに関する質問は、ほぼ打ちのめされてきましたが、誰も答えを出していないように思われるので、非常にイライラしています。私がやろうとしていること私には比較的単純に思われます:.wavファイルにある特定の時間の周波数を正確に知りたいのです。たとえば、「時刻nミリ秒からn + 1ミリ秒、音の平均周波数はxヘルツ "でした。フーリエ変換やゲルツェルアルゴリズム、およびさまざまなモジュールについて、私には思えない人々が話しているのを見てきました。私が説明したことを行う方法を理解するために、「pythonでwavファイルの頻度を見つける」などのことを約20回調べてみましたが、役に立ちませんでした。誰かが私を助けてくれませんか?

私が探しているのは、この疑似コードのような解決策、または疑似コードが得ているようなことをする少なくとも1つの解決策です。

import some_module_that_can_help_me_do_this as freq

file = 'output.wav'
start_time = 1000  # Start 1000 milliseconds into the file
end_time = 1010  # End 10 milliseconds thereafter

print("Average frequency = " + str(freq.average(start_time, end_time)) + " hz")

(あなたが言うことができると確信しているように)私が数学の馬鹿であると仮定してください。これが私の最初の質問なので、穏やかに

私はOPのフラストレーションを感じました-誰かが必要とする場合、スペクトログラムの画像を見る代わりに、スプレクトグラムの値を取得する方法を見つけるのはそれほど難しくありません:

#!/usr/bin/env python

import librosa
import sys
import numpy as np
import matplotlib.pyplot as plt
import librosa.display

np.set_printoptions(threshold=sys.maxsize)

filename = 'filename.wav'
Fs = 44100
clip, sample_rate = librosa.load(filename, sr=Fs)

n_fft = 1024  # frame length 
start = 0 

hop_length=512

#commented out code to display Spectrogram
X = librosa.stft(clip, n_fft=n_fft, hop_length=hop_length)
#Xdb = librosa.amplitude_to_db(abs(X))
#plt.figure(figsize=(14, 5))
#librosa.display.specshow(Xdb, sr=Fs, x_axis='time', y_axis='hz') 
#If to pring log of frequencies  
#librosa.display.specshow(Xdb, sr=Fs, x_axis='time', y_axis='log')
#plt.colorbar()

#librosa.display.waveplot(clip, sr=Fs)
#plt.show()

#now print all values 

t_samples = np.arange(clip.shape[0]) / Fs
t_frames = np.arange(X.shape[1]) * hop_length / Fs
#f_hertz = np.arange(N / 2 + 1) * Fs / N       # Works only when N is even
f_hertz = np.fft.rfftfreq(n_fft, 1 / Fs)         # Works also when N is odd

#example
print('Time (seconds) of last sample:', t_samples[-1])
print('Time (seconds) of last frame: ', t_frames[-1])
print('Frequency (Hz) of last bin:   ', f_hertz[-1])

print('Time (seconds) :', len(t_samples))

#prints array of time frames 
print('Time of frames (seconds) : ', t_frames)
#prints array of frequency bins
print('Frequency (Hz) : ', f_hertz)

print('Number of frames : ', len(t_frames))
print('Number of bins : ', len(f_hertz))

#This code is working to printout frame by frame intensity of each frequency
#on top line gives freq bins
curLine = 'Bins,'
for b in range(1, len(f_hertz)):
    curLine += str(f_hertz[b]) + ','
print(curLine)

curLine = ''
for f in range(1, len(t_frames)):
    curLine = str(t_frames[f]) + ','
    for b in range(1, len(f_hertz)): #for each frame, we get list of bin values printed
        curLine += str("%.02f" % np.abs(X[b, f])) + ','
        #remove format of the float for full details if needed
        #curLine += str(np.abs(X[b, f])) + ','
        #print other useful info like phase of frequency bin b at frame f.
        #curLine += str("%.02f" % np.angle(X[b, f])) + ',' 
    print(curLine)
1
Deepak Garud

以下に沿って何かを試してみてください、私が生成した周波数1234の正弦波ファイルで私にとってはうまくいきました このページから

from scipy.io import wavfile

def freq(file, start_time, end_time):
    sample_rate, data = wavfile.read(file)
    start_point = int(sample_rate * start_time / 1000)
    end_point = int(sample_rate * end_time / 1000)
    length = (end_time - start_time) / 1000
    counter = 0
    for i in range(start_point, end_point):
        if data[i] < 0 and data[i+1] > 0:
            counter += 1
    return counter/length    

freq("sin.wav", 1000 ,2100)
1231.8181818181818

編集:forループを少しクリーンアップ

0
vitalious