• librosa的短时傅里叶实现librosa.stft()


    目录

    1. API参数解析

    2. 分帧机制

    2.1 C语言实现

    2.1.1 测试代码

    2.2 librosa的短时傅里叶变换实现

    2.2.1 libsora.stft()的分帧机制

    2.2.2 测试代码

    2.2.3 运行结果分析

    2.3 librosa的短时傅里叶逆变换实现

    3. 附录:librosa官网


    1. API参数解析

    函数原型

    librosa.stft((y, n_fft=2048, hop_length=None, win_length=None, \

    window='hann', center=True, pad_mode='reflect'))

    函数功能

    对语音进行分帧,加窗,及短时傅里叶变换的计算(FFT)

    参数

    (1) y: 输入的音频时间序列(一般是通过librosa.load()得到)

    (2) n_fft : FFT的点数,fft的点数跟窗长可以是不同的,但是一般设置成相同

    (3) hop_length : 帧移

    (4) win_length : 指的是滑动窗[截断窗]的窗长,一般来说,让这两个相等win_length=n_fft

    (5) window : 指定窗函数,字符串的形式,如果不指定,则默认是汉宁窗

    (6) center : bool类型,默认值是True,一般使用默认的值即可。指”中心对齐”。这和分帧的机制相关,是我们重点需要研究的参数。

    (7) pad_mode : 填充模式设置,使用默认的参数即可,表示使用数据0填充帧数据。

    返回值

    返回复数矩阵(实数序列经过分帧、加窗以及傅里叶变换后得到的是复数序列,a+bi的形式)。

    定义处(源文件)

    声明处(头文件)

    2. 分帧机制

    Libsora的短时傅里叶变换,分帧有点“不常规”。以256个采样点的傅里叶变换为例。

    实验数据:为了更直观、简洁、方便地进行试验和理解API的参数以及实现机制,预先从音频文件中读出256个采样点,用数组或者列表进行存储。同样,汉宁窗也可以实现计算出来,并存储,使用时直接查表,可避免运算量,这是算法处理中常见的“以牺牲空间换取时间效率”的做法。

    2.1 C语言实现

    直接对这256个点进行傅里叶变换,傅里叶变换的点数就是256,阶数就是8。采用复数的FFT计算算法,对于输入:实数部分就是音频数据,虚部全为0。

    2.1.1 测试代码

    1. #define FRAME_LEN 256
    2. #define FFT_ORDER ((int)log2(FRAME_LEN))
    3. float dat_i[FRAME_LEN], dat_a[FRAME_LEN];
    4. float dat_r[FRAME_LEN]={
    5. 0.000214,
    6. 0.000122,
    7. -0.000061,
    8. 0.000275,
    9. 0.000092,
    10. 0.000336,
    11. 0.000153,
    12. -0.000092,
    13. 0.000031,
    14. 0.000305,
    15. 0.000641,
    16. 0.000458,
    17. 0.000305,
    18. 0.000153,
    19. 0.000397,
    20. 0.000732,
    21. 0.000885,
    22. 0.000580,
    23. 0.000427,
    24. 0.000397,
    25. 0.000641,
    26. 0.001190,
    27. 0.001282,
    28. 0.000977,
    29. 0.000336,
    30. 0.000458,
    31. 0.001007,
    32. 0.001617,
    33. 0.001465,
    34. 0.000824,
    35. 0.000275,
    36. 0.000366,
    37. 0.001007,
    38. 0.001282,
    39. 0.000885,
    40. 0.000122,
    41. -0.000336,
    42. -0.000122,
    43. 0.000336,
    44. 0.000275,
    45. -0.000153,
    46. -0.000824,
    47. -0.000916,
    48. -0.000580,
    49. -0.000519,
    50. -0.000763,
    51. -0.001099,
    52. -0.001221,
    53. -0.001007,
    54. -0.000580,
    55. -0.000793,
    56. -0.000885,
    57. -0.001038,
    58. -0.000580,
    59. -0.000275,
    60. -0.000214,
    61. -0.000549,
    62. -0.000610,
    63. -0.000061,
    64. 0.000702,
    65. 0.001190,
    66. 0.000763,
    67. 0.000305,
    68. 0.000275,
    69. 0.001068,
    70. 0.001923,
    71. 0.001953,
    72. 0.001190,
    73. 0.000488,
    74. 0.000519,
    75. 0.001251,
    76. 0.001740,
    77. 0.001282,
    78. 0.000397,
    79. -0.000183,
    80. 0.000000,
    81. 0.000214,
    82. 0.000305,
    83. -0.000092,
    84. -0.000458,
    85. -0.000732,
    86. -0.000610,
    87. -0.000671,
    88. -0.000916,
    89. -0.000946,
    90. -0.000824,
    91. -0.000702,
    92. -0.001068,
    93. -0.000977,
    94. -0.001190,
    95. -0.000671,
    96. -0.000244,
    97. -0.000122,
    98. -0.000580,
    99. -0.000854,
    100. -0.000519,
    101. 0.000153,
    102. 0.000641,
    103. 0.000671,
    104. 0.000214,
    105. -0.000122,
    106. 0.000336,
    107. 0.000732,
    108. 0.000702,
    109. 0.000397,
    110. 0.000122,
    111. 0.000122,
    112. 0.000275,
    113. 0.000000,
    114. -0.000458,
    115. -0.000580,
    116. -0.000275,
    117. 0.000092,
    118. -0.000244,
    119. -0.001373,
    120. -0.001892,
    121. -0.001465,
    122. -0.000153,
    123. 0.000214,
    124. -0.000641,
    125. -0.002533,
    126. -0.002808,
    127. -0.001526,
    128. 0.000549,
    129. 0.000946,
    130. -0.000824,
    131. -0.002594,
    132. -0.002625,
    133. -0.000427,
    134. 0.001678,
    135. 0.001587,
    136. -0.000397,
    137. -0.002075,
    138. -0.001526,
    139. 0.000549,
    140. 0.002014,
    141. 0.001740,
    142. -0.000122,
    143. -0.001678,
    144. -0.000916,
    145. 0.000610,
    146. 0.001556,
    147. 0.000977,
    148. -0.000580,
    149. -0.001251,
    150. -0.000854,
    151. -0.000183,
    152. 0.000214,
    153. -0.000031,
    154. -0.000671,
    155. -0.001007,
    156. -0.001221,
    157. -0.000916,
    158. -0.000824,
    159. -0.000427,
    160. -0.000549,
    161. -0.000732,
    162. -0.000610,
    163. -0.000854,
    164. -0.000671,
    165. -0.000458,
    166. -0.000183,
    167. 0.000031,
    168. 0.000275,
    169. 0.000427,
    170. -0.000092,
    171. -0.000397,
    172. 0.000000,
    173. 0.000793,
    174. 0.001526,
    175. 0.001465,
    176. 0.000122,
    177. -0.001068,
    178. -0.000854,
    179. 0.000946,
    180. 0.002472,
    181. 0.002014,
    182. -0.000488,
    183. -0.002350,
    184. -0.002075,
    185. 0.000702,
    186. 0.002686,
    187. 0.001801,
    188. -0.001526,
    189. -0.003662,
    190. -0.002472,
    191. 0.000793,
    192. 0.002747,
    193. 0.001740,
    194. -0.001251,
    195. -0.002991,
    196. -0.001648,
    197. 0.001160,
    198. 0.003143,
    199. 0.002289,
    200. 0.000244,
    201. -0.000916,
    202. -0.000305,
    203. 0.001526,
    204. 0.002960,
    205. 0.002808,
    206. 0.002289,
    207. 0.001221,
    208. 0.000092,
    209. 0.000427,
    210. 0.001404,
    211. 0.003021,
    212. 0.003479,
    213. 0.001709,
    214. -0.001068,
    215. -0.002502,
    216. -0.001007,
    217. 0.001831,
    218. 0.002960,
    219. 0.000427,
    220. -0.003510,
    221. -0.005157,
    222. -0.002930,
    223. 0.000580,
    224. 0.001648,
    225. -0.001038,
    226. -0.004486,
    227. -0.005463,
    228. -0.002991,
    229. -0.000122,
    230. 0.000885,
    231. -0.000488,
    232. -0.002045,
    233. -0.002289,
    234. -0.001129,
    235. 0.000214,
    236. 0.001343,
    237. 0.002441,
    238. 0.003448,
    239. 0.002991,
    240. 0.001282,
    241. 0.000153,
    242. 0.002014,
    243. 0.006134,
    244. 0.008820,
    245. 0.006439,
    246. 0.000793,
    247. -0.002625,
    248. 0.000488,
    249. 0.007111,
    250. 0.010132,
    251. 0.004669,
    252. -0.004791,
    253. -0.009033,
    254. -0.004028,
    255. 0.004089,
    256. 0.006104,
    257. -0.002228,
    258. -0.013214,
    259. -0.016327,
    260. -0.009583,
    261. };
    262. int main(void)
    263. {
    264. for (int i=0; i
    265. dat_i[i]=0.0;
    266. dat_r[i]=dat_r[i]*hanning[i];
    267. }
    268. FFT(dat_r, dat_i, dat_a, FRAME_LEN, FFT_ORDER);
    269. // for (int i=0; i
    270. // printf("[%d] (%f+%fj)\n", i, dat_r[i], dat_i[i]);
    271. // printf("%d %f\n", i, dat_r[i]);
    272. // }
    273. #if 1
    274. FILE* fp_dbg=NULL;
    275. fp_dbg = fopen("res_fft.txt", "wb");
    276. for (int i=0; i
    277. fprintf(fp_dbg, "[%d]:%f\n", i, dat_r[i]);
    278. }
    279. fclose(fp_dbg);
    280. printf("data output done\n");
    281. #endif
    282. return 0;
    283. }

    2.1.2 运行结果分析

    [0] (-0.016482+0.000000j) //直流分量

    [1] (0.023277+0.005782j)

    [2] (-0.022870+-0.002839j)

    [3] (0.008954+-0.001403j)

    [4] (0.009356+-0.005058j)

    [5] (0.003737+0.002048j)

    [6] (-0.016804+0.000179j)

    [7] (-0.005669+0.038893j)

    [8] (0.003740+-0.042136j)

    [9] (0.001611+0.004286j)

    [10] (0.001527+0.002011j)

    [11] (0.000186+0.000361j)

    [12] (0.000990+-0.000215j)

    [13] (0.000373+-0.000256j)

    [14] (-0.001273+0.000464j)

    [15] (0.001159+0.001058j)

    [16] (0.000621+-0.001287j)

    [17] (-0.000673+0.001001j)

    [18] (0.000025+-0.000228j)

    [19] (-0.000244+-0.000012j)

    [20] (0.000698+0.000222j)

    [21] (-0.000256+-0.000116j)

    [22] (-0.000189+-0.000112j)

    [23] (0.000449+0.000111j)

    [24] (-0.000790+0.000218j)

    [25] (0.000185+0.000019j)

    [26] (0.001250+-0.000179j)

    [27] (-0.000985+-0.000131j)

    [28] (-0.000077+0.000429j)

    [29] (0.000429+-0.000058j)

    [30] (-0.000620+-0.000187j)

    [31] (0.000907+0.000340j)

    [32] (-0.000126+-0.000314j)

    [33] (0.000024+-0.000142j)

    [34] (-0.000503+0.000532j)

    [35] (0.001116+0.000584j)

    [36] (0.000258+-0.000051j)

    [37] (0.000807+0.000773j)

    [38] (0.003857+0.003912j)

    [39] (-0.022648+0.023224j)

    [40] (-0.000071+-0.056523j)

    [41] (0.021825+0.018984j)

    [42] (0.006530+0.003042j)

    [43] (-0.019067+0.025972j)

    [44] (0.002945+-0.045785j)

    [45] (0.010391+0.040381j)

    [46] (-0.018414+-0.019886j)

    [47] (0.010679+0.007567j)

    [48] (0.014649+-0.022715j)

    [49] (-0.007632+0.028023j)

    [50] (-0.004731+-0.005551j)

    [51] (0.000074+-0.000718j)

    [52] (-0.000791+-0.000904j)

    [53] (0.000014+-0.000019j)

    [54] (0.000344+0.000090j)

    [55] (0.000134+-0.000584j)

    [56] (-0.000264+0.000585j)

    [57] (-0.000724+-0.000490j)

    [58] (0.001307+-0.000154j)

    [59] (-0.001079+0.000291j)

    [60] (0.000548+-0.000334j)

    [61] (-0.000573+0.000041j)

    [62] (0.000840+-0.000249j)

    [63] (-0.000619+0.000665j)

    [64] (-0.000148+-0.000633j)

    [65] (0.000158+0.000457j)

    [66] (0.000138+-0.000554j)

    [67] (0.000081+0.000580j)

    [68] (-0.000484+-0.000325j)

    [69] (0.000552+-0.000122j)

    [70] (-0.000070+0.000219j)

    [71] (-0.000362+-0.000100j)

    [72] (0.000310+-0.000062j)

    [73] (0.000635+0.000270j)

    [74] (-0.001663+-0.000394j)

    [75] (0.001318+0.000141j)

    [76] (-0.000177+0.000009j)

    [77] (-0.000646+-0.000014j)

    [78] (0.000624+0.000356j)

    [79] (-0.000049+-0.000515j)

    [80] (-0.000366+-0.000084j)

    [81] (0.000828+0.000682j)

    [82] (-0.001138+-0.000252j)

    [83] (0.000686+-0.000317j)

    [84] (-0.000067+0.000474j)

    [85] (-0.000097+-0.000849j)

    [86] (0.000413+0.001005j)

    [87] (-0.000761+-0.000557j)

    [88] (0.000237+0.000295j)

    [89] (0.000096+-0.000673j)

    [90] (0.000482+0.000729j)

    [91] (-0.000311+-0.000147j)

    [92] (-0.000463+-0.000385j)

    [93] (0.000049+0.000497j)

    [94] (0.000472+-0.000785j)

    [95] (0.000007+0.001097j)

    [96] (0.000009+-0.000468j)

    [97] (-0.000771+0.000036j)

    [98] (0.000657+-0.000847j)

    [99] (0.000456+0.001364j)

    [100] (-0.001066+-0.000980j)

    [101] (0.000792+0.000747j)

    [102] (-0.000536+-0.000571j)

    [103] (0.000696+-0.000112j)

    [104] (-0.000424+0.000539j)

    [105] (-0.000023+-0.000251j)

    [106] (0.000105+-0.000071j)

    [107] (-0.000341+0.000353j)

    [108] (0.000462+-0.001015j)

    [109] (-0.000282+0.001091j)

    [110] (0.000073+-0.000221j)

    [111] (0.000250+-0.000085j)

    [112] (-0.000258+-0.000122j)

    [113] (-0.000355+-0.000028j)

    [114] (0.001097+0.000032j)

    [115] (-0.001402+0.000154j)

    [116] (0.001382+0.000325j)

    [117] (-0.001009+-0.001084j)

    [118] (0.000305+0.000141j)

    [119] (-0.000007+0.001139j)

    [120] (0.000040+-0.000427j)

    [121] (-0.000253+-0.000659j)

    [122] (0.000403+0.000886j)

    [123] (-0.000065+-0.000793j)

    [124] (-0.000628+0.000475j)

    [125] (0.001202+-0.000259j)

    [126] (-0.000712+0.000480j)

    [127] (0.000087+-0.000369j)

    [128] (-0.000109+0.000000j) //直流分量

    [129] (0.000087+0.000369j)

    [130] (-0.000712+-0.000480j)

    [131] (0.001202+0.000259j)

    [132] (-0.000628+-0.000475j)

    [133] (-0.000065+0.000793j)

    [134] (0.000403+-0.000886j)

    [135] (-0.000253+0.000659j)

    [136] (0.000040+0.000427j)

    [137] (-0.000007+-0.001139j)

    [138] (0.000305+-0.000141j)

    [139] (-0.001009+0.001084j)

    [140] (0.001382+-0.000325j)

    [141] (-0.001402+-0.000154j)

    [142] (0.001097+-0.000032j)

    [143] (-0.000355+0.000028j)

    [144] (-0.000258+0.000122j)

    [145] (0.000251+0.000085j)

    [146] (0.000073+0.000221j)

    [147] (-0.000282+-0.001091j)

    [148] (0.000462+0.001015j)

    [149] (-0.000341+-0.000353j)

    [150] (0.000105+0.000071j)

    [151] (-0.000023+0.000251j)

    [152] (-0.000424+-0.000539j)

    [153] (0.000696+0.000112j)

    [154] (-0.000536+0.000571j)

    [155] (0.000792+-0.000747j)

    [156] (-0.001066+0.000980j)

    [157] (0.000456+-0.001364j)

    [158] (0.000657+0.000847j)

    [159] (-0.000771+-0.000036j)

    [160] (0.000009+0.000468j)

    [161] (0.000007+-0.001097j)

    [162] (0.000472+0.000785j)

    [163] (0.000049+-0.000497j)

    [164] (-0.000463+0.000385j)

    [165] (-0.000311+0.000147j)

    [166] (0.000482+-0.000729j)

    [167] (0.000096+0.000673j)

    [168] (0.000237+-0.000295j)

    [169] (-0.000761+0.000557j)

    [170] (0.000413+-0.001005j)

    [171] (-0.000097+0.000849j)

    [172] (-0.000067+-0.000474j)

    [173] (0.000686+0.000317j)

    [174] (-0.001138+0.000252j)

    [175] (0.000828+-0.000682j)

    [176] (-0.000366+0.000084j)

    [177] (-0.000049+0.000515j)

    [178] (0.000624+-0.000356j)

    [179] (-0.000646+0.000014j)

    [180] (-0.000177+-0.000009j)

    [181] (0.001318+-0.000141j)

    [182] (-0.001663+0.000394j)

    [183] (0.000635+-0.000270j)

    [184] (0.000310+0.000062j)

    [185] (-0.000362+0.000100j)

    [186] (-0.000070+-0.000219j)

    [187] (0.000552+0.000122j)

    [188] (-0.000484+0.000325j)

    [189] (0.000081+-0.000580j)

    [190] (0.000138+0.000554j)

    [191] (0.000158+-0.000457j)

    [192] (-0.000148+0.000633j)

    [193] (-0.000619+-0.000665j)

    [194] (0.000840+0.000249j)

    [195] (-0.000573+-0.000041j)

    [196] (0.000548+0.000334j)

    [197] (-0.001079+-0.000291j)

    [198] (0.001307+0.000154j)

    [199] (-0.000724+0.000490j)

    [200] (-0.000264+-0.000585j)

    [201] (0.000134+0.000584j)

    [202] (0.000344+-0.000090j)

    [203] (0.000014+0.000019j)

    [204] (-0.000791+0.000904j)

    [205] (0.000074+0.000718j)

    [206] (-0.004731+0.005551j)

    [207] (-0.007631+-0.028023j)

    [208] (0.014648+0.022715j)

    [209] (0.010679+-0.007567j)

    [210] (-0.018414+0.019886j)

    [211] (0.010392+-0.040381j)

    [212] (0.002945+0.045785j)

    [213] (-0.019067+-0.025972j)

    [214] (0.006530+-0.003042j)

    [215] (0.021826+-0.018984j)

    [216] (-0.000071+0.056523j)

    [217] (-0.022648+-0.023224j)

    [218] (0.003857+-0.003912j)

    [219] (0.000807+-0.000773j)

    [220] (0.000258+0.000051j)

    [221] (0.001116+-0.000584j)

    [222] (-0.000503+-0.000532j)

    [223] (0.000024+0.000142j)

    [224] (-0.000126+0.000314j)

    [225] (0.000907+-0.000340j)

    [226] (-0.000620+0.000187j)

    [227] (0.000429+0.000058j)

    [228] (-0.000077+-0.000429j)

    [229] (-0.000985+0.000131j)

    [230] (0.001250+0.000179j)

    [231] (0.000185+-0.000019j)

    [232] (-0.000790+-0.000218j)

    [233] (0.000449+-0.000111j)

    [234] (-0.000189+0.000112j)

    [235] (-0.000256+0.000116j)

    [236] (0.000698+-0.000222j)

    [237] (-0.000244+0.000012j)

    [238] (0.000025+0.000228j)

    [239] (-0.000673+-0.001001j)

    [240] (0.000621+0.001286j)

    [241] (0.001159+-0.001058j)

    [242] (-0.001273+-0.000464j)

    [243] (0.000373+0.000256j)

    [244] (0.000990+0.000215j)

    [245] (0.000186+-0.000361j)

    [246] (0.001527+-0.002011j)

    [247] (0.001611+-0.004286j)

    [248] (0.003740+0.042136j)

    [249] (-0.005668+-0.038893j)

    [250] (-0.016804+-0.000179j)

    [251] (0.003737+-0.002048j)

    [252] (0.009356+0.005058j)

    [253] (0.008954+0.001403j)

    [254] (-0.022870+0.002839j)

    [255] (0.023277+-0.005782j)

    注:

    (1)实数FFT的运算结果得到复数序列

    (2)第0个和第FRAME_LEN/2个是直流分量,其余的结果具有“共轭对称性”,即DFT的共轭对称性:X(m)=X^*(N-m)

    (3)注意运算结果的前129个数据,要与下文的libsora.stft()的结果做对比

    根据实数的FFT结果具有“共轭对称性”的性质,可以优化FFT计算算法,将大大减小运算量和存储空间,一般来说像Matlab或者Python都有实数FFT计算的API,比如做256个点的FFT,只输出129个点的数据即可(没必要返回冗余数据),。为方便理解,这里采用的是复数的FFT算法。测试代码中,个人实现的API简单说明如下:

    /*

    float dataR[]:时域上,输入序列的实部;计算结束,变成频域上频点的实部

    float dataR[]:时域上,输入序列的虚部(都是0);计算结束,变成频域上频点的虚部

    float dataA[]:运算结果序列的幅值。

    int N:FFT序列的长度

    int M:FFT序列的阶数

    */

    void FFT(float dataR[], float dataI[], float dataA[], int N, int M);

    2.2 librosa的短时傅里叶变换实现

    用相同的数据源,由于librosa.stft()默认加的是汉宁窗,这里就没必要先进行计算。

    2.2.1 libsora.stft()的分帧机制

    (1) librosa.stft输出的帧数比正常计算的帧数多一帧,它分帧策略的准则是中心对齐的,即分帧点位于该帧的中心,首尾帧之外都有半个帧长度的padding。而padding部分使用0数据填充。

    (2) 输出帧数的计算公式:signal_length/hop_length + 1

    例:比如,一个语音端共有256个点。分帧的帧长为256,帧移取一半,也就是128,那么折叠的部分就是256-128=128。

    正常的分帧方法可分为两个帧,第二帧(最后一帧)的后半部分用0填充,或者一般来说,最后一帧可以直接舍弃【但是在实时语音处理中,分段处理,不能这么做!】。如下图:

     而librosa的做法是会在数据的头部和尾部增加半个帧长度的填充”,再进行分帧,如下图:

    输入的数据:data=dat1+dat2

    第一帧数据:128个0+dat1

    第二帧数据:data=dat1+dat2

    第三帧数据:dat2+128个0

    每次的傅里叶变换都是256个点的输入。

    2.2.2 测试代码

    文件:libsora_test.py

    1. import librosa
    2. from librosa.core.spectrum import amplitude_to_db
    3. import numpy as np
    4. import soundfile as sf
    5. import matplotlib.pyplot as plt
    6. dat_r = np.array([
    7. 0.000214,
    8. 0.000122,
    9. -0.000061,
    10. 0.000275,
    11. 0.000092,
    12. 0.000336,
    13. 0.000153,
    14. -0.000092,
    15. 0.000031,
    16. 0.000305,
    17. 0.000641,
    18. 0.000458,
    19. 0.000305,
    20. 0.000153,
    21. 0.000397,
    22. 0.000732,
    23. 0.000885,
    24. 0.000580,
    25. 0.000427,
    26. 0.000397,
    27. 0.000641,
    28. 0.001190,
    29. 0.001282,
    30. 0.000977,
    31. 0.000336,
    32. 0.000458,
    33. 0.001007,
    34. 0.001617,
    35. 0.001465,
    36. 0.000824,
    37. 0.000275,
    38. 0.000366,
    39. 0.001007,
    40. 0.001282,
    41. 0.000885,
    42. 0.000122,
    43. -0.000336,
    44. -0.000122,
    45. 0.000336,
    46. 0.000275,
    47. -0.000153,
    48. -0.000824,
    49. -0.000916,
    50. -0.000580,
    51. -0.000519,
    52. -0.000763,
    53. -0.001099,
    54. -0.001221,
    55. -0.001007,
    56. -0.000580,
    57. -0.000793,
    58. -0.000885,
    59. -0.001038,
    60. -0.000580,
    61. -0.000275,
    62. -0.000214,
    63. -0.000549,
    64. -0.000610,
    65. -0.000061,
    66. 0.000702,
    67. 0.001190,
    68. 0.000763,
    69. 0.000305,
    70. 0.000275,
    71. 0.001068,
    72. 0.001923,
    73. 0.001953,
    74. 0.001190,
    75. 0.000488,
    76. 0.000519,
    77. 0.001251,
    78. 0.001740,
    79. 0.001282,
    80. 0.000397,
    81. -0.000183,
    82. 0.000000,
    83. 0.000214,
    84. 0.000305,
    85. -0.000092,
    86. -0.000458,
    87. -0.000732,
    88. -0.000610,
    89. -0.000671,
    90. -0.000916,
    91. -0.000946,
    92. -0.000824,
    93. -0.000702,
    94. -0.001068,
    95. -0.000977,
    96. -0.001190,
    97. -0.000671,
    98. -0.000244,
    99. -0.000122,
    100. -0.000580,
    101. -0.000854,
    102. -0.000519,
    103. 0.000153,
    104. 0.000641,
    105. 0.000671,
    106. 0.000214,
    107. -0.000122,
    108. 0.000336,
    109. 0.000732,
    110. 0.000702,
    111. 0.000397,
    112. 0.000122,
    113. 0.000122,
    114. 0.000275,
    115. 0.000000,
    116. -0.000458,
    117. -0.000580,
    118. -0.000275,
    119. 0.000092,
    120. -0.000244,
    121. -0.001373,
    122. -0.001892,
    123. -0.001465,
    124. -0.000153,
    125. 0.000214,
    126. -0.000641,
    127. -0.002533,
    128. -0.002808,
    129. -0.001526,
    130. 0.000549,
    131. 0.000946,
    132. -0.000824,
    133. -0.002594,
    134. -0.002625,
    135. -0.000427,
    136. 0.001678,
    137. 0.001587,
    138. -0.000397,
    139. -0.002075,
    140. -0.001526,
    141. 0.000549,
    142. 0.002014,
    143. 0.001740,
    144. -0.000122,
    145. -0.001678,
    146. -0.000916,
    147. 0.000610,
    148. 0.001556,
    149. 0.000977,
    150. -0.000580,
    151. -0.001251,
    152. -0.000854,
    153. -0.000183,
    154. 0.000214,
    155. -0.000031,
    156. -0.000671,
    157. -0.001007,
    158. -0.001221,
    159. -0.000916,
    160. -0.000824,
    161. -0.000427,
    162. -0.000549,
    163. -0.000732,
    164. -0.000610,
    165. -0.000854,
    166. -0.000671,
    167. -0.000458,
    168. -0.000183,
    169. 0.000031,
    170. 0.000275,
    171. 0.000427,
    172. -0.000092,
    173. -0.000397,
    174. 0.000000,
    175. 0.000793,
    176. 0.001526,
    177. 0.001465,
    178. 0.000122,
    179. -0.001068,
    180. -0.000854,
    181. 0.000946,
    182. 0.002472,
    183. 0.002014,
    184. -0.000488,
    185. -0.002350,
    186. -0.002075,
    187. 0.000702,
    188. 0.002686,
    189. 0.001801,
    190. -0.001526,
    191. -0.003662,
    192. -0.002472,
    193. 0.000793,
    194. 0.002747,
    195. 0.001740,
    196. -0.001251,
    197. -0.002991,
    198. -0.001648,
    199. 0.001160,
    200. 0.003143,
    201. 0.002289,
    202. 0.000244,
    203. -0.000916,
    204. -0.000305,
    205. 0.001526,
    206. 0.002960,
    207. 0.002808,
    208. 0.002289,
    209. 0.001221,
    210. 0.000092,
    211. 0.000427,
    212. 0.001404,
    213. 0.003021,
    214. 0.003479,
    215. 0.001709,
    216. -0.001068,
    217. -0.002502,
    218. -0.001007,
    219. 0.001831,
    220. 0.002960,
    221. 0.000427,
    222. -0.003510,
    223. -0.005157,
    224. -0.002930,
    225. 0.000580,
    226. 0.001648,
    227. -0.001038,
    228. -0.004486,
    229. -0.005463,
    230. -0.002991,
    231. -0.000122,
    232. 0.000885,
    233. -0.000488,
    234. -0.002045,
    235. -0.002289,
    236. -0.001129,
    237. 0.000214,
    238. 0.001343,
    239. 0.002441,
    240. 0.003448,
    241. 0.002991,
    242. 0.001282,
    243. 0.000153,
    244. 0.002014,
    245. 0.006134,
    246. 0.008820,
    247. 0.006439,
    248. 0.000793,
    249. -0.002625,
    250. 0.000488,
    251. 0.007111,
    252. 0.010132,
    253. 0.004669,
    254. -0.004791,
    255. -0.009033,
    256. -0.004028,
    257. 0.004089,
    258. 0.006104,
    259. -0.002228,
    260. -0.013214,
    261. -0.016327,
    262. -0.009583,
    263. ])
    264. res = librosa.stft(dat_r, n_fft=256, hop_length=128, win_length=256)
    265. print("shape-res:", res.shape)
    266. print("row-res:", res.shape[0]) #行数
    267. print("col-res:", res.shape[1]) #列数
    268. #np.savetxt('dat_r_fft.txt', res, fmt="%f") #保存结果矩阵(复数矩阵,a+bi的形式)
    269. #np.savetxt('dat_r_fft.txt', np.real(res), fmt="%f") #保存每一帧的实部
    270. #np.savetxt('dat_r_fft.txt', np.imag(res), fmt="%f") #保存每一帧的虚部
    271. lis0 = []
    272. lis1 = []
    273. lis2 = []
    274. for i in range(res.shape[0]):
    275. lis0.append(np.real(res[i][0])) #取第一帧的实数部分(结果矩阵的第一列数据)
    276. lis1.append(np.real(res[i][1])) #取第二帧的实数部分(结果矩阵的第二列数据)
    277. lis2.append(np.real(res[i][2])) #取第三帧的实数部分(结果矩阵的第三列数据)
    278. np.savetxt('res_fft_0.txt', lis0, fmt="%f")
    279. np.savetxt('res_fft_1.txt', lis1, fmt="%f")
    280. np.savetxt('res_fft_2.txt', lis2, fmt="%f")

    2.2.3 运行结果分析

    >>python librosa_test.py

    shape-res: (129, 3)  #返回的矩阵大小:129行 x 3列,每一列就是一帧数据

    #分成了三帧语音进行处理,每一帧是256个采样点,但是FFT的输

    #出只保留了129个数据,没有输出冗余数据。--实数FFT的实现

    row-res: 129

    col-res: 3

    为方便对比数据,将每一帧的运算结果的实数部分保存到txt文本中。

    对比第二帧的结果,如下:可发现前129个数据近似相等[自己写的复数FFT算法有计算精度上的差异]。

     同样可以对比验证,第一和第三帧的FFT结果,从而证实librosa的分帧机制。

    2.3 librosa的短时傅里叶逆变换实现

    对应的API是:librosa.istft

    参数一致即可。逆变换会根据正变换的规则,处理重叠部分,还原数据帧。测试代码如下:

    res = librosa.stft(dat_r, n_fft=256, hop_length=128, win_length=256)

    ……

    ires = librosa.istft(res, n_fft=256, hop_length=128, win_length=256)

    np.savetxt('ires.txt', ires, fmt="%f")

    对比结果,和输入序列数据是一致的。

    3. 附录:librosa官网

    Core IO and DSP — librosa 0.9.2 documentation

  • 相关阅读:
    redis6.0引入多线程
    渗透学习-靶场篇-XSS之订单与shell箱子反杀
    如何搭建一个好看的github主页
    js逆向算法
    Struts.xml 配置文件说明
    10驾校科目一考试系统——窗口交互
    【launch启动文件播放数据包】
    黑客公开“接单”,电子邮件成首选作案工具
    电子电气架构设计需要考虑哪些方面?
    聊聊 K8S:K8S集群搭建实战
  • 原文地址:https://blog.csdn.net/qq_40088639/article/details/126611146